Dziwna rzecz z decimal separatorem

Dziwna rzecz z decimal separatorem
MA
  • Rejestracja:około 17 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Poznań
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 ?

b0bik
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 miesiące
  • Postów:1112
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

MA
  • Rejestracja:około 17 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Poznań
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

crowa
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

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

Kopiuj
 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

Kopiuj
 SET NOCOUNT ON
SET XACT ABORT ON

Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
b0bik
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 miesiące
  • Postów:1112
0
crowa napisał(a)

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

Kopiuj
 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

Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
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

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

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
MA
  • Rejestracja:około 17 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Poznań
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

zajcev
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 8 lat
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*!

Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
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...


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
crowa
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
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 '.'


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
EL
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 15 lat
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.

EgonOlsen
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 12 lat
0

A moze by tak sprawdzic ustawienia lokalne systemu?


<img src="http://www.siglaunch.com/sigs/wow/6/2/7/2/5/1762725HEdyN.png" alt="user image" />
I am he who watches they. I am the fist of retribution. That which does quell the recalcitrant. Dare you defy the Warchief? Dare you face my merciless judgement?
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 minuty
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:

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.