Delphi 7 - SQL - formátovanie desatinného čísla
V Delphi zadávam do SQL parametre cez Format(). Problém je, že ak formátujem desatinné číslo pomocou identifikátora %n, tak mi ho naformátuje podľa toho ako sa formátuje na Slovensku. Výsledok je teda s desatinnou čiarkou a SQL mi to nezoberie. Dá sa nejako prikázať tejto funkcii, aby dávala desatinnú bodku? Zatiaľ to robím cez Str() a parameter 5s, ale je to podľa mňa nezmysel to takto komplikovať.
Napr. si musis zmenit aktualne Locale, alebo nepouzivat funkciu ktora bere aktualny locale, ale funkciu ktora ma pevny format. Napr. http://www.delphibasics.co.uk/RTL.asp?Name=FloatTo StrF
http://www.delphibasics.co.uk/RTL.asp?Name=Decimal Separator
To by som práveže meniť nechcel, pretože ja chcem inde zobrazovať správny formát. Len ide o to, že či existuje možnosť pevne nastaviť nejako desatinnú bodku.
pozeram ze DecimalSeparator sa pouziva aj pri fcii Format aspon tu to pisu RTL.asp
takze by malo stacit zmenit DecimalSeparator na znak jaky chces
Tak to som si v tom zozname ani nevšimol. Tiež som mal tú stránku otvorenú. Ďakujem, ale nakoniec asi budem používať Str(), pretože ak v programe budem potrebovať desatinné čísla, tak potom to budem meniť dokola.
Mozes pouzit format a dve cele cisla neco ako "%u.%u" a ako 1. parameter das desatinne cislo zaokruhlene na cele smerom nadol (a pretypovane na unsigned integer), a druhy parameter das trebars (desatinn cislo*100) skonvertovane na cele cislo (a pretypovane na unsigned integer) a budes to mat zobrazene na 2 desatinne miesta.
To len ako priklad, mozes to riesit vselijako
Alebo ten DecimalSeparator mozes menit pred kazdym volanim Format tak jak zrovna potrebujes. Ale potom pozor neni to thread safe (ten problem ta zaujima len ak vytvaras viac threadov)
P.S. standardny DecimalSeparator je DecimalSeparator = LOCALE_SDECIMAL, ak to budes chciet zmenit na ten povodny. Alebo si ho pred Format() ulozis do nejakej premennej a potom nastavis na to co bol predtym
Príklad:
predpokladám, že si pochopil...
Samozrejme, ale vyššie som k tomuto písal, že chcem, aby bola desatinná čiarka vždy a v danom prípade chcem explicitne prikázať funkcii Format(), aby použila desatinnú bodku. To možné nie je a preto to riešim starou overenou procedúrou Str(), ktorú mám ošetrenú tak, aby som ju vedel použíť ako funkciu. Tú zavolám, reálne číslo mi prevedie bez ohľadu na lokálne nastavenia tak ako potrebujem a to pomocou parametra %s odovzdám funkcii Format(). Je to najjednoduchšie riešenie a nikto zatiaľ nenapísal nič jednoduchšie.
No ved to v jeho priklade explicitne prikazes len tomu FloatToStr. Format() ma tiez moznost dat mu ako parameter FormatSettings premennu. To je len lokalna premenna neovplyvnujes tym system
Presne tak.. je použitá premenná (je jedno či lokálna), ktorá "nesie v sebe" nastavenia, tie sa použijú pri formátovaní - bez ohľadu/ovplyvnenia nastavenia systému.
Môže si z toho urobiť vlastnú funkciu a používať podľa ľubovôle (oddeľovač desatinných miest môže byť akýkoľvek znak)...
Asi mi nerozumieš.
Porovnaj si tento kód:
S týmto:
Ja myslím, že môj je oveľa jednoduchší a v podstate aj rýchlejší, pokiaľ by bolo treba pozerať na rýchlosť. V mojej funkcii si viem určovať jednoducho aj počet desatinných miest, čo sa v tvojej nedá bez ďalších nastavení. Mimochodom, ja som potreboval poradiť s Formať a toto je už ďalšia funkcia navyše, ktorú som mal aj bez toho. V každom prípade za pomoc ďakujem, ale nie je to také ako som si predstavoval.
Máš to vyriešené jednoducho pomocou Str(), potom naozaj nechápem prečo chceš použiť Format().
Ak potrebuješ Formátovať výstup:
Pretože cez Format() formátujem SQL príkazy a nechcel som vytvárať funkciu navyše, ale desatinné čísla priamo formátovať cez Format().
No konečne sme sa dostali k tomu o čo presne ide a prečo to nejde.
Funkcie na formátovanie reťazcov použijú lokálne nastavenia systému, ak to chceš inak - musíš to zmeniť v nastaveniach TFormatSettings. Howk.
Písal som to aj na začiatku a potom som napísal aj to, že nijaké nastavenia meniť nechcem, pretože Format() potrebujem, aby formátoval pre Slovensko. Chcel som a ešte raz to napíšem, či je nejaká možnosť ako vynútiť vo Format() formátovanie desatinných čísel s desatinnou bodkou. Išlo mi čisto o formátovací reťazec. Ak mám meniť nastavenia, tak je pre mňa rýchlejšie použiť Str() upravené pre použitie ako funkcia.
Ja už neviem ako ináč Ti to mám polopatisticky napísať...
formátuje to tak, ako je nastavené lokálne prostredie vo Windows !!!
áno je nejaká možnosť - použiješ TFormatSettings !!!
niekoľko príkladov som napísal, stále nechápem čo je pre Teba zložité: "Ak mám meniť nastavenia, tak je pre mňa rýchlejšie použiť Str() upravené pre použitie ako funkcia."
Ako desatinná bodka sa použije len v tejto upravenej funkcii, nikde inde to nebude mať vplyv !!!
Ak je pre Teba rýchlejšie a jednoduchšie použiť Str(), tak ho používaj, ukázal som Ti ako sa to dá pomocou Format resp. FormaFloat, ale ak nechápeš, alebo nie si schopný pochopiť čo Ti tu stále vysvetľujem, potom je mi ľúto.
Edit:
Skús si sám: