Użycie specyfikatora
ffCurrency ma tą wadę, że do wyniku konwersji zostanie dodany symbol waluty zdefiniowany w aplecie
Panelu Sterowania Opcje regionalne i językowe. Więc w tym przypadku - gdy mamy do czynienia z różnymi walutami to raczej nie wchodzi w grę.
Masz jednak rację co do funkcji
CurrToStr, która zawsze zwróci tylko 4 znaki po przecinku bez żadnych dodatkowych symboli:
float x = 123.4567891;
Edit1->Text = CurrToStr(x); // wynik: 123.4568
Jak widać wynik został zaokrąglony w górę, gdyż po liczbe 4567 występuje cyfra 8. Gdyby tam była cyfra mniejsza od 5 (np. 123.4567491) to wynik zostałby zaokrąglony w dół.
Przydać może się jeszcze funkcja CurrToStrF, która działa podobnie, pozwala jednak określić ile liczb zostanie podanych po przecinku, ale znaczące będą jednak tylko cztery cyfry, powyżej zostaną dodane same 0:
float x = 123.4563491678901234;
Edit1->Text = CurrToStrF(x, ffNumber, 10); // wynik: 123,4564000000
Pozostaje problem zapisu liczb dziesiętnych. Jeżeli w systemie jako separator został zdefiniowany przecinek, a użytkownik użyje kropki to konwersja tekstu na liczbę się nie uda - wyskoczy błąd.
Opis sytuacji: Użytkownik w polu Edit2 wpisał liczbę dziesiętną z separatorem w postaci kropki, próba konwersji tekstu na liczbę się nie powiedzie:
float x = StrToFloat( Edit2->Text );
W takiej sytuacji trzeba sprawdzić jakiego separatora użył użytkownik i ustawić właściwy.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TFormatSettings fSet;
GetLocaleFormatSettings(1045, fSet);
wchar_t sDec = fSet.DecimalSeparator;
int dPos = Edit2->Text.Pos( "." );
if( dPos > 0 ) /* zmieniamy separator na użyty przez użytkownika */
{
fSet.DecimalSeparator = '.';
}
else
{
fSet.DecimalSeparator = ',';
}
float x = StrToFloat(Edit2->Text, fSet);
fSet.DecimalSeparator = sDec; /* przywracamy systemowy separator */
Edit1->Text = CurrToStr(x, fSet);
}
Ten kod dokona konwersji na liczbę niezależnie od tego jakiego separatora użyje użytkownik
(w grę wchodzą tylko kropka i przecinek), a wynik zostanie wyświetlony z separatorem właściwym dla ustawień systemowych.
Kod nie zadziała chyba w środowisku C++Builder 6 i starszych.