Temat: Kupiłem IDE
Andrzej Prażmo:
Dariusz Półtorak:
Andrzej Prażmo:
Dokumentację PHP należy czytać zaczynając od komentarzy. Niestety.
Może dlatego właśnie przegapiłeś że number_format przyjmuje float. Swoją drogą możesz dać przykład ? Przed chwilką wrzuciłem mu na pałę kilka liczb i nie było z tym problemów.
To sprawdź coś takiego:
$foo = "123 000,44";
echo number_format((float)$foo, 2, ",", " ");
Dla mnie takie zachowanie tej funkcji jest niedopuszczalne. Powinien "pójść" wyjątek a nie takie cuda.
Wyjątków w PHP nie uświadczysz jeżeli ich nie chcesz. Gdyby ktoś zezwolił na wyrzucanie wyjątków to trzeba by przepisać wszystko na sieci co jest w PHP niestety. Dlatego właśnie takie narzędzia jak np PDO wyrzucają wyjątki tylko jeżeli je skonfigurujesz by to robiły.
Poza tym ja tu cudów nie widzę, tylko brak podstaw u Ciebie. number_format() działa poprawnie. Zrobił rzutowanie na float i przetworzył liczbę wg parametrów.
$foo = "123 000,44";
echo number_format((float)$foo, 2, ",", " ");
Popatrz na ten kod i powiedz mi - gdzieś Ty w jakimkolwiek języku widział zapis 123 000,44 ?? Nie powinno być przypadkiem 123000,44 ?? To jest float.
Twój skrypt wyrypał się na konwertowaniu. number_format działa poprawnie. Konwertowanie zresztą też. Spójrz na to:
$foo = "123 000,44";
echo (float)$foo;
Nic nie musiałeś rzutować bo number_format zrobi to i tak za Ciebie. Kwestia tego jak to robi. Przy konwersji PHP leci od lewej do prawej i przepisuje wartość zmiennej dopóki nie natrafi na coś co nie pasuje do wzorca. Zakłada że od tego momentu wartość jest nieprawidłowa i obcina ją.
Dlatego Twoja wartość została odcięta po 123 bo spacja nie jest cyfrą ani przecinkiem. Dla większości z nas jest to jasne jak słońce. Sam nawet pisząc artykuł
http://di.com.pl/porady/34832,0,PHP_a_bezpieczenstwo_%...
zwróciłem na to uwagę w rozdziale 4, "Są równi i równiejsi".
Żeby Twój kod działa wystarcza 1 zmiana i usunięcie zbędnego rzutowania:
$foo = "123000,44";
echo number_format($foo, 2, ",", " ");
lub lepiej:
$foo = 123000.44;
echo number_format($foo, 2, ",", " ");
Proste ? Proste. Można się kłócić że w wypadku odrzutu PHP mógł by wyrzucić wyjątek, dać notice albo zwrócić null czy coś - ale tak nie robi i tyle. Przyjęto inne założenie i trzeba je znać. To podstawy.
Nie zwalaj winy za niewiedzę na język. Zasady rzutowania są jasno określone.
http://www.php.net/manual/en/language.types.string.php...Dariusz Półtorak edytował(a) ten post dnia 12.09.12 o godzinie 11:11