Inny język i błędy konwersji liczb ToDouble() (6.5 / 6,5)

0

Witam,

Problem polega na tym że otrzymuje string z wartością: "6.5" i jeśli język na komputerze użytkownika jest ustawiony na English nie ma problemu z konwersją na double:

AnsiString temp = XMLNode->Attributes["some_variable"];
double variable = temp.ToDouble();

Przy English jest ok natomiast jeśli spróbuje się wykonać konwersje "6,5" to otrzymamy error "is not a valid floating point value".

Natomiast jeśli zmienię język na komputerze na np French to dochodzi do zamiany formatów i teraz chcąc wykonać powyższą konwersję z "6.5" otrzymam error "is not a valid floating point value" natomiast konwersja z "6,5" nie wywoła błędu.

Jak sprawdzać format i co ustawić w borlandzie by rozwiązać ten problem bo funkcje ToDouble() używam wszędzie wrrrr

Jakieś sugestie?

1

Ok znalazłem rozwiązanie i proszę tylko o skorygowanie czy jest to poprawne:
przy starcie aplikacji ustawiam:

DecimalSeparator = '.';

więc niezależnie od formatu na kompie do konwersji użyty będzie '.' (niezależnie czy ustawiony będzie English czy French) - czy to jest poprawne?

1

PS sprawdzić jaki decimal separator jest używany mogę poprzez:

char CurrencyDecimalSeparator = GetLocaleChar(LOCALE_SYSTEM_DEFAULT, LOCALE_SMONDECIMALSEP, 0);

Pytanie czy w czasie działania aplikacji może się zmienić decimal separator który ustawiam w mojej aplikacji (np poprzez działanie GetFormatSettings która jest często w innych sytuacjach wywoływana w ukryciu)? Czy wystarczy odczytać w form create i ustawić jeśli trzeba właściwy DecimalSeparator i tyle?

0

Nie ustawiaj DecimalSeparator on sam się ustawi na taki jaki zadeklarowano w systemie.

0

Problem, leży w tym, że używasz funkcji, która jest zależna od locale w miejscu, w którym należy używać zawsze locale "C".
Sama zmiana DecimalSeparator raczej wystarczy, pod warunkiem, że nie ma jakiegoś dziwnego locale, w którym wymagane są inne znaki.
C++ buildera nie używałem całe wieki więc nie pamiętam, jaka jest prawidłowa metoda. Najlepiej poszukaj w dokumentacji jak się obsługuje locale, może tam znajdziesz czy dostarczają jakiś sposób by wykonywać konwersję w stosując "C" locale (np tworząc własny obiekt opisujący locale).

0
_13th_Dragon napisał(a):

Nie ustawiaj DecimalSeparator on sam się ustawi na taki jaki zadeklarowano w systemie.

No właśnie w tym rzecz że się ustawia i sprawia problemy bo przy French ustawia się na ',' i próba skonwertowania "6.5" kończy się errorem (a w tym formacie otrzymuję dane z serwera) i dlatego zmiana DecimalSeparator w przypadku gdy jest inny niż '.' powinna rozwiązać sprawę z tego co widzę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1