Dziwna rzecz z decimal separatorem

0

Mam pare gridow, w ktorych wyswietlane sa dane(zmiennoprzecinki). I raz na jakis bardzo rzadki czas, nawala decimalspearator, ktory ustawiam na starcie programu na kropkę. Wiec czasem, wtedy na gridach mam dane z separatorem przecinka. Czy ja tu nawalilem, czy jest jakies wyjasnienie, czemu to sie zdarza ?
Kodu nie ma co pokazywac, po prostu podczas logowania uzytkownika, pobieram oryginalny separator i nadpisuje go kropka. Chyba ze lepiej dac w OnCreate glownej formy to ?

0

Za helpem:

{...}

Delphi VCL (non-console) applications will automatically update these formatting variables in response to WM_WININICHANGE messages. Application.UpdateFormatSettings will either allow or not allow changes in system settings. The default is True. Set this property to False to prevent the system settings from changing.

{...}

Jesli masz problem z konwersją mozesz przed konwersją robić:

aStr := StringReplace(aStr, ',', DecimalSeparator, []);
aStr := StringReplace(aStr, '.', DecimalSeparator, []);

b

0

No, ten cytat troche wyjasnia i ustawie na False tą propercję. Sadzilem ze skoro ustawiam DecimalSpeparator na starcie programu, to on obowiazuje przez caly czas jego trwania.
A drugi sposob jest nieefektywny, majac naprawde duzo insertow do bazy i innych....

Ale dzieki, powinno byc dobrze :P

0

ja zawsze robilem to w ten sposob.
Tworzylem zmienna globalna
var fDecimalSeparator: Char;
W sekcji inicjalizacji aplikacji, biblioteki etc. przypisywalem

 fDecimalSeparator := DecimalSeparator;
DecimalSeparator := '.'; 

W sekcji destroy lub w miejscu gdzie konieczna jest zmiana na wartosci oryginalne przywracalem je.
Dodam ze uzywam tego przy budowaniu dosc pokaznych skryptow SQL'owych (naprawde duzych :) ).
Wszelkie operacje typu FloatToStr itp dzialaja poprawnie :)
Ps. Pamietaj ze jesli taki skrypt jest budowany jako polaczenie wielu operacji to dla obiektu dostepowego ADO nalezy na poczatku dodac

 SET NOCOUNT ON
SET XACT ABORT ON
0
crowa napisał(a)

ja zawsze robilem to w ten sposob.
Tworzylem zmienna globalna
var fDecimalSeparator: Char;
W sekcji inicjalizacji aplikacji, biblioteki etc. przypisywalem

 fDecimalSeparator := DecimalSeparator;
DecimalSeparator := '.'; 

W sekcji destroy lub w miejscu gdzie konieczna jest zmiana na wartosci oryginalne przywracalem je.

No ale patrząc na tego helpa, to też mogło Ci nie działać w przypadku wymienionego tam komunikatu. Zresztą patrząc na tego helpa to dochodzę też do wniosku że niepotrzebnie się trudziłeś pamiętając oryginalną wersję - jej zmiana w Twojej aplikacji nie miała wpływu na system.

b

0

a nie możecie tego robić po Bożemu???

gdzieś zmienna globalna
fs: TFormatSettings;
i np. w initialization ustawić wszelkie formaty
fs.DecimalSeparator := '-';
a potem w kodzie

ShowMessage(FloatToStr(StrToFloat('123-45', fs), fs));

i w ^$#*$ mieć to co jest ustawione w systemie

0

jesli 'to jest po Bozemu ' to nc.... Podwojna konwersja. Po prostu mam aplikacje dzialajaca niekoniecznie w Polsce, i chce sie trzymac jednego standardu czyli kropki. I najlepiej ustawic DecimalSeparator, niz do kazdej konwersji dodawac ten FS(Ogolnie z bazy od razu ciagne jako string wartosci liczbowe). I ogolnie to dziala OK, tylko raz na bardzo rzadki czas wskakiwal przecinek i nie wiedzialem jak temu zaradzic :-P

0
maciejmt napisał(a)

jeśli 'to jest po Bożemu ' to nc....

nc? no comment? tak kolego programisto.. to właśnie jest PO BOŻEMU... jak próbujesz ustawiać separator systemowy to się tylko na ośmieszenie wystawiasz..

to pewnie jak np. Toyota robiłaby samochody na Niemcy to z samochodu wywaliłbyś amortyzatory?
(nie to żeby mieli wszędzie równe drogi ale przykład dobry)

ty napisz aplikacje ustawiającą na kropkę.. inny programista na przecinek.. klient będzie używać obu aplikacji.. i co? i jesteś w czarnej d*!

0
maciejmt napisał(a)

jesli 'to jest po Bozemu ' to nc.... Podwojna konwersja.
Ty naprawde takim kretynem jesteś? Przecież to jest przykład jak tego używać, ale widać czytanie ze zrozumieniem to trudna sztuka dla niektórych...

0

spokojnie :) kazdy sposob jest dobry. Ja nie chcialem pobierac LocaleSetings wiec uzywam DecimalSeparator (dziala dobrze)

PS. zapamietywalem stara wartosc po to zeby np wyswietlac w editach dane zgodne z ustawieniami systemu a do bazy zawsze posylalem '.'

0

Wczoraj/dzisiaj miałem podobny problem (zmiana czasu z zimowego na letni). Miałem ustawiony DecimalSeparator na '.' w FormCreate bo tak mi się wydawało najlepiej :| , (aplikacja działała przez noc). Wszystkie liczby zmiennoprzecinkowe pozapisywało mi z ','. Niestety akurat przez nieprzemyślenie serie liczb były separowane ',' i zrobił mi się totalny groch z kapustą :-/ Ale teraz już wiem dlaczego ;) Dzięki za wyjaśnienie.

0

A moze by tak sprawdzic ustawienia lokalne systemu?

0
b0bik napisał(a)

ZDelphi VCL (non-console) applications will automatically update these formatting variables in response to WM_WININICHANGE messages.

Windows 7 ma buga przez co VCL może czasami pobierać zły format z systemu. Dotyczy to nawet Delphi 2010. Żeby to obejść, trzeba dodać w pliku dpr wywołanie SetThreadLocale i GetFormatSettings:

begin
  // windows 7 locale bug workaround: sometimes wrong thread locale id gets reported,
  // causing sysutils time and number formatting functions to misbehave. this'll fix:
  SetThreadLocale(LOCALE_USER_DEFAULT);
  GetFormatSettings;

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Szczegóły techniczne dlaczego tak się czasem dzieje tu.

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