siedzę nad c# zdobywając tytuł ‘master of strings’ bo muszę pisać coś w stylu dziwnego parsera. nauczyłem się regexpów, i dziwnych wynalzków do konwertowania.

i tak a propos stringów

tutaj jest jeszcze kilka fajnych od bartosza:
http://stackoverflow.com/questions/84556/whats-your-favorite-programmer-cartoon

a teraz mała dziwnostka:
oczywiście dotarłem do kłamstwa, nad którym musiałem się sporo nabiedzić. funkcji konwertujących jest w pytkę ale oczywiście jak się ma konkretny pomysł to nic nie działa jak powinno. ot taki świetny link pokazujący potęgę konwersji. jest tam taki opisik:

Every object has a method called ToString that returns a string representation of the object. The ToString method can accept a string parameter, which tells the object how to format itself – in the String.Format call, the formatting string is passed after the position, for example, “{0:##}”


no i qpa. problem: skonwertować liczbę zmiennoprzecinkową tak, aby była wyrównana do prawej, z dokładnością do dwóch znaków po przecinq w zapisie amerykańskim [‘.’ oddziela część dziesiętną]. no więc można byłoby tak:

float flt=-1234,289F;
string out= flt.ToString("{0,15:0.00}");

co oczywiście nie zadziałało. taka konwersja działa w ogóle bardzo dziwnie – wszystkie znaczki { , : etc – traktowane są jak część liczby i wychodzi z tego:

-{1 2315:4,29}

a więc trochę jakby nie to. ponieważ występuje w zdaniu ‘formatuje sam siebię’ a więc można pominąć {0} bo wiadomo, że to o niego chodzi. Ciekawie traktowany jest minus – zupełnie jakby liczba składała się z liczby i z minusa:

string out=flt.ToString(" 0.00");

co powinno pokazać liczbę przesuniętą o klika spacji w prawo. wynik:

- 1234,29

wygląda na to, że ToString z przeciążenia na liczbie nie przyjmuje parametrów formatowania. finalnie trzeba było skomplikować:

string out=string.Format("{0,15}",flt.ToString("0.00",new System.Globalization.ClutureInfo("en-US")));

ufff.. niuanse językowe…

Spread the love

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.