Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /* Creative Commons License
- *
- * String to number conversion v1.2
- * by kukoc (Adam Lukaszczyk)
- * licensed under a Creative Commons Uznanie autorstwa 2.5 Polska License
- * http://creativecommons.org/licenses/by/2.5/pl/
- *
- * Wolno: kopiowac, rozpowszechniac, odtwarzac i wykonywac utwor, tworzyc utwory zalezne
- * Na nastepujacych warunkach: Uznanie autorstwa. Utwor nalezy oznaczyc w sposob okreslony przez Tworce lub Licencjodawce
- *
- * Jezyk programowania: PHP
- */
- function kukocIsNumeric($txt) {
- // w przypadku liczby 1.234 oraz 1,234 funkcja korzysta z ustawien localeconv() aby określić czy liczba to 1234 czy 1 i 234/1000
- $tabelaLocale = localeconv();
- $znakUlamka = quotemeta($tabelaLocale["decimal_point"]);
- $znakSeparatora = ($znakUlamka == ",") ? "\." : ",";
- $porownanie = '/(?J) # zezwolenie na nadpisywanie zmiennych
- ^(?:-\040?)? # opcjonalny minus mozliwy odstep - rozpoznanie odstepu potrzebne
- (?!(?:0[^,\.])) # dozwolone tylko jedno zero na poczatku - jesli to liczba dziesietna
- (?(?=(\d*[\040,\.]){2,}) # IF
- [1-9] # znakow ze zbioru [,\.] jest wiecej niz 1; wstawia ograniczenie - liczba nie moze zaczac sie od zera
- (?:\d*(?P<separator>[\040,\.]?))? # rozpoznanie separatora tysiecznego
- (?:\d{3}(?P=separator)?)* # szukanie kolejnych separatorow tego samego rodzaju
- (?P<ulamek>[,\.]?)\d+ # rozpoznanie znaku ulamka
- |
- ([1-9]\d*(?:(?P<ulamek>['.$znakUlamka.'])|(?P<separator>[\040'.$znakSeparatora.']))?\d{3} # "inteligentne" rozpoznanie czy separator czy ulamek
- |
- \d*(?P<ulamek>[,\.]?)\d+) # jest tylko jeden znak ze zbioru [,\.], rozpoznanie znaku ulamka
- )
- $/x';
- if (preg_match($porownanie,$txt,$wyniki)) {
- $ulamek = $separator = null;
- if (isset($wyniki["ulamek"]) && $wyniki["ulamek"] != "") $ulamek = $wyniki["ulamek"];
- if (isset($wyniki["separator"]) && $wyniki["separator"] != "") $separator = $wyniki["separator"];
- return Array($ulamek,$separator);
- }
- else return false;
- }
- $tablica = array(
- "1,123", // jesli nie mozna jednoznacznie rozpoznac czy to ulamek czy separator, uzywane sa ustawienia locale systemu
- "0,123", // ulamek
- "10,1231", // ulamek
- "10,123", // jesli nie mozna jednoznacznie rozpoznac czy to ulamek czy separator, uzywane sa ustawienia locale systemu
- "10,12", // ulamek
- "-1",
- ".1",
- ",1",
- "0.1",
- "0,1",
- "0.001",
- "-0.001",
- "1000",
- "1 000", // tysiac
- "1,000", // jesli nie mozna jednoznacznie rozpoznac czy to ulamek czy separator, uzywane sa ustawienia locale systemu
- "1.000", // jesli nie mozna jednoznacznie rozpoznac czy to ulamek czy separator, uzywane sa ustawienia locale systemu
- "1.00", // jeden
- "1000,0", // tysiac
- "1 000,000", // tysiac
- "1.000,000", // tysiac
- "1,000.000", // tysiac
- "10.000.000", // milion
- "10.212.000.000", // milion
- "1 000 000 000,000", // miliard
- "1 000.000,000", // zla liczba uzyte rozne separatory tysieczne
- "00.1", // zla liczba
- "1,", // zla liczba
- "1.", // zla liczba
- "0 1", // zla liczba
- "0,0.01", // zla liczba
- "00001", // traktuje to jako zla liczba, choc mozna by dodac parametr ZEROFILL :)
- "011", // traktuje to jako zla liczba, choc mozna by dodac parametr ZEROFILL :)
- "aaa", // zla liczba
- "1-1", // zla liczba
- "1-", // zla liczba
- "1000 0", // zla liczba - separatory zle ustawione
- "1 0000 0000", // zla liczba - separatory zle ustawione
- "- 1" // dobra liczba jednak funkcja powinna zwrocic spacje jako separator
- );
- setlocale(LC_ALL,"fr");
- //setlocale(LC_ALL,"en");
- echo "<pre>";
- foreach($tablica as $txt) {
- if ($daneLiczby = kukocIsNumeric($txt))
- echo "$txt - ulamek: '{$daneLiczby['0']}', separator: '{$daneLiczby['1']}'\n";
- else
- echo "<b>$txt - to nie liczba.</b>\n";
- }
- echo "</pre>";
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement