witam blinksmiley.gif

pewnie nie raz spotkaliście się z trudnościami związanymi z brakiem sztywnych typów zmiennych w PHP.
w moim przypadku głównie problemy narastają gdy w interakcji z użytkownikiem wymienia się wiele liczb, zarówno całkowitych jak i rzeczywistych.
dodam że użytkownicy są międzynarodowi - różne formaty, różne style zapisu numerów.
wiadomo, można by za pomocą np. JavaScryptu ograniczyć formularz tylko do jednego formatu...
ale dlaczego mamy zmuszać francuza do pisania liczb po angielsku, albo anglika do pisania po polsku.

ostatnio siedziałem trochę nad tym problemem jak zuniwersalizować zapis liczb i ich właściwą konwersję do typu float.

chciałbym zaproponować poniższe rozwiązanie - wyrażenie regularne, które rozpoznaje jakie są tysięczne separatory i znaki dziesiętne i stwierdza czy dany ciąg znaków to liczba....
parę rzeczy przydałoby się jeszcze poprawić. dlatego zapraszam do testowania i dyskusji na temat optymalizacji tego REGEXPa.

Funkcja sprawdzająca czy podany tekst to liczba którą można przekonwertować do typu float:
Zamieszczam poprawioną wersję:

czarodziej.gif http://pastebin.com/f3a40abf4

funkcja automatycznie rozpoznaje w stringu wejściowym liczby:

- całkowite, np. 1; 2; 234
- całkowite z separatorem, np. 2 434; 41 002; 1.000.000; 2,000,000
- zmiennoprzecinkowe, np. 1,2; 0.234; .434
- zmiennoprzecinkowe z separatorem, np. 1 000,2; 20.234,32; 3,000.00
- ujemne, np. -12; -324.3

dozwolone separatory tysięczne to spacja, przecinek i kropka a znaki dziesiętne to: kropka i przecinek

występuje jeden format liczby kiedy nie wiadomo czy podany znak to separator czy znak dziesiętny, gdy jest tylko jeden znak (kropka albo przecinek), na prawo od niego występują dokładnie trzy cyfry, na lewo pomiędzy jedną a trzema cyframi, np: 1.234; 234,001
w tym przypadku brane są pod uwagę ustawienia locale systemu (dla ustawień angielskich liczba 1,234 to 1234, a dla francuskich to 1 i 234 tysięczne)

dla liczb ujemnych ze spacja pomiędzy minusem a liczbą, funkcja nie rozpoznaje jeszcze tej spacji.