Separator dziesiętny

Czasem wymagane jest, aby użytkownik podał do naszej aplikacji jakieś dane liczbowe. Na przykład ilość pieniędzy jakie program kosztuje, ilość kopii dokumentu jakie chce wydrukować czy cokolwiek innego. To, że użytkownikowi każemy “podaj liczbę dodatnią”, a ten poda ujemną albo zero to w miarę normalne i przed tym się wiele aplikacji zabezpiecza i mniej więcej każdy programista o tym wie. Gorzej jednak wygląda sprawa z separatorem dziesiętnym.

Intuicyjnym dla nas formatem rozdzielenia części całkowitej i ułamkowej jest przecinek, Polska należy do grupy krajów nawet nazywanych “krajami przecinka”, jednak dla krajów anglosaskich separatorem jest kropka. A że z tamtym kręgiem kulturowym związanych jest większość języków programowania, to w nich najczęściej stosowanym separatorem dziesiętnym jest także kropka. Przecinek zarezerwowany jest na przykład do oddzielania parametrów wywołania funkcji.

Co to za sobą niesie? Że użytkownik może podać dane w “nieprawidłowym” dla programu, ale intuicyjnym dla niego, formacie, tj. z przecinkiem w Polsce, podczas gdy program operuje na kropce. A co to może spowodować? A na przykład bardzo dziwne wyniki obliczeń, ja na pewnej stronie dowiedziałem się, że mam niedowagę ze wskaźnikiem BMI 2,16 oraz zawartością tłuszczu w organizmie -8,78% (sic!). A tylko dlatego, ze jako wagę podałem 72,7 kg, zamiast 72.7 kg, jakich oczekiwał skrypt.

Screen niepoprawnie działającej aplikacji

Jak się przed tym bronić? Jedną z najprostszych metod jest oczywiście pobieranie od użytkownika danych jako łańcuch znaków i następnie zamiana przecinków na kropki, po czym dopiero konwersja na wartość zmiennoprzecinkową. Jeżeli tego nie zrobimy to wyniki mogą być wprost absurdalne - ujemna zawartość tłuszczu w moim ciele to po prostu dobry żart, ale co jeżeli nagle w jakimś systemie księgowym znajdą się ujemne wypłaty dla programistów?

Liczba komentarzy: 5

»
  1. #1 devnul
    maj 5, 2007 godzina 16:27

    ale co jeżeli nagle w jakimś systemie księgowym znajdą się ujemne wypłaty dla programistów?

    Będzie kłopocik :)

  2. #2 DeeJay1
    maj 6, 2007 godzina 19:29

    To programiści sami sobie będą w brodę pluć za fuszerkę ;)

  3. #3 Bigismall
    maj 6, 2007 godzina 20:50

    function numeric(number) {
    var str = new String(number);
    var wzor = /,/g;
    var out= str.replace(wzor,”.”);
    return parseFloat(out);
    }

  4. #4 Wojtosz
    maj 6, 2007 godzina 23:14

    @DeeJay1
    nie będą ;-) z 2 powodów:
    1′ klient przyjął oprogramowanie jako “zgodne z jego oczekiwaniami” (zapewne podpisał papier traktujący o tym)
    2′ w dokumentacji oprogramowania odnotowana jest kropka jako separator dziesiętny

    poza kolejnością:
    3′ fix buga zajmie do 15 minut (z odpaleniem kompa włącznie), a wyznaczony zostanie termin realizacji do 3 dni roboczych
    4′ inne rzeczy, które programista wymyśleć potrafi ;-)

    (komentarz żartobliwy)

  5. #5 Robert Drózd
    maj 10, 2007 godzina 10:22

    Inna sprawa, że popularne języki takie jak php i js, są lekko niedorobione i powinny string z przecinkiem traktować w odpowiednim kontekście jako liczbę.

Wątek RSS dla komentarzy tego wpisu · Adres trackback

Zostaw komentarz

Dozwolone są niektóre znaczniki XHTML, jak: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Na tym blogu stosowana jest wtyczka antyspamowa Spam Karma. Jeżeli Twój komentarz nie pojawia się, lub po jego dodaniu otrzymujesz pustą stronę - poczekaj, komentarz został dodany, ale albo oczekuje w kolejce, albo został mylnie zakwalifikowany jako spam - spokojnie, gdy zajrzę do panelu administracyjnego to uratuję go.