Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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ť.

Předmět Autor Datum
Napr. si musis zmenit aktualne Locale, alebo nepouzivat funkciu ktora bere aktualny locale, ale funk…
MM.. 30.05.2013 14:29
MM..
To by som práveže meniť nechcel, pretože ja chcem inde zobrazovať správny formát. Len ide o to, že č…
msx. 30.05.2013 14:33
msx.
pozeram ze DecimalSeparator sa pouziva aj pri fcii Format aspon tu to pisu RTL.asp takze by malo sta…
MM.. 30.05.2013 14:32
MM..
Tak to som si v tom zozname ani nevšimol. Tiež som mal tú stránku otvorenú. Ďakujem, ale nakoniec as…
msx. 30.05.2013 14:36
msx.
Mozes pouzit format a dve cele cisla neco ako "%u.%u" a ako 1. parameter das desatinne cislo zaokruh…
MM.. 30.05.2013 14:49
MM..
Alebo ten DecimalSeparator mozes menit pred kazdym volanim Format tak jak zrovna potrebujes. Ale pot…
MM.. 30.05.2013 14:49
MM..
Príklad: var s: string; fs : TFormatSettings; GetLocaleFormatSettings(0, fs); fs.DecimalSeparator :…
pme 30.05.2013 15:04
pme
Samozrejme, ale vyššie som k tomuto písal, že chcem, aby bola desatinná čiarka vždy a v danom prípad…
msx. 30.05.2013 16:44
msx.
No ved to v jeho priklade explicitne prikazes len tomu FloatToStr. Format() ma tiez moznost dat mu a…
MM.. 30.05.2013 16:52
MM..
Presne tak.. je použitá premenná (je jedno či lokálna), ktorá "nesie v sebe" nastavenia, tie sa použ…
pme 30.05.2013 17:08
pme
Asi mi nerozumieš. Porovnaj si tento kód: function Float2String(r: Real): String; var fs : TFormat…
msx. 30.05.2013 17:31
msx.
Máš to vyriešené jednoducho pomocou Str(), potom naozaj nechápem prečo chceš použiť Format(). Ak po…
pme 30.05.2013 17:50
pme
Pretože cez Format() formátujem SQL príkazy a nechcel som vytvárať funkciu navyše, ale desatinné čís…
msx. 30.05.2013 18:17
msx.
No konečne sme sa dostali k tomu o čo presne ide a prečo to nejde. Funkcie na formátovanie reťazcov…
pme 30.05.2013 18:30
pme
Písal som to aj na začiatku a potom som napísal aj to, že nijaké nastavenia meniť nechcem, pretože F…
msx. 01.06.2013 13:41
msx.
Ja už neviem ako ináč Ti to mám polopatisticky napísať... Format() potrebujem, aby formátoval pre S… poslední
pme 01.06.2013 13:55
pme

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

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.

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:

function Float2String(r: Real): String;
var 
  fs : TFormatSettings; 
begin
  GetLocaleFormatSettings(0, fs);
  fs.DecimalSeparator := '.';
  fs.ThousandSeparator := '';
  Result := FloatToStr(r, fs);
end;

S týmto:

function Float2String(r: Real): String;
var
  s: String;
begin
  Str(r : 1 : 1, s);
  Result := s;
end;

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:

function Float2String(r: Real): String;
var
  fs: TFormatSettings;
begin
  fs.DecimalSeparator:='.';
  Result := FormatFloat('### ###.##', r, fs);   //tiež si môžem zadefinovať koľko desatinných miest
end;

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

Format() potrebujem, aby formátoval pre Slovensko

formátuje to tak, ako je nastavené lokálne prostredie vo Windows !!!

či je nejaká možnosť ako vynútiť vo Format() formátovanie desatinných čísel s desatinnou bodkou

áno je nejaká možnosť - použiješ TFormatSettings !!!

function Format ( Const Formatting : string; Const Data : array of const; FormatSettings : TFormatSettings ) : string;

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

function Float2String(r: Real): String;
var
  fs: TFormatSettings;
begin
  fs.DecimalSeparator:='.';
  Result := FormatFloat('### ###.##', r, fs);   //môžeš použiť miesto FormatFloat aj Tvoje obľúbené Format
end;

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:

var
  fs : TFormatSettings;
begin
  fs.DecimalSeparator:='.';
  ShowMessage(Format('Fixed            = %f', [12345.678]));      //vypíše podľa lokálneho nastavenia Windows u mňa je to čiarka
  ShowMessage(Format('Fixed            = %f', [12345.678],fs));   //vypíše sa s bodkou, pretože som použil ako parameter fs (TFromatSettings - desatinný odeľovač=bodka
  ShowMessage(Format('Fixed            = %f', [12345.678]));      //vypíšeš opäť s čiarkou
end;

Zpět do poradny Odpovědět na původní otázku Nahoru