Advertisement
Guest User

kukoc

a guest
Apr 7th, 2009
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.71 KB | None | 0 0
  1. <?php
  2. /* Creative Commons License
  3.  *
  4.  * String to number conversion v1.2
  5.  * by kukoc (Adam Lukaszczyk)
  6.  * licensed under a Creative Commons Uznanie autorstwa 2.5 Polska License
  7.  * http://creativecommons.org/licenses/by/2.5/pl/
  8.  *
  9.  * Wolno: kopiowac, rozpowszechniac, odtwarzac i wykonywac utwor, tworzyc utwory zalezne
  10.  * Na nastepujacych warunkach: Uznanie autorstwa. Utwor nalezy oznaczyc w sposob okreslony przez Tworce lub Licencjodawce
  11.  *
  12.  * Jezyk programowania: PHP
  13.  */
  14.  
  15.  function kukocIsNumeric($txt) {
  16.     // w przypadku liczby 1.234 oraz 1,234 funkcja korzysta z ustawien localeconv() aby okre&#347;li&#263; czy liczba to 1234 czy 1 i 234/1000
  17.     $tabelaLocale = localeconv();
  18.     $znakUlamka = quotemeta($tabelaLocale["decimal_point"]);
  19.     $znakSeparatora = ($znakUlamka == ",") ? "\." : ",";
  20.  
  21.     $porownanie = '/(?J) # zezwolenie na nadpisywanie zmiennych
  22.     ^(?:-\040?)? # opcjonalny minus mozliwy odstep - rozpoznanie odstepu potrzebne
  23.     (?!(?:0[^,\.])) # dozwolone tylko jedno zero na poczatku - jesli to liczba dziesietna
  24.     (?(?=(\d*[\040,\.]){2,}) # IF
  25.         [1-9] # znakow ze zbioru [,\.] jest wiecej niz 1; wstawia ograniczenie - liczba nie moze zaczac sie od zera
  26.         (?:\d*(?P<separator>[\040,\.]?))? # rozpoznanie separatora tysiecznego
  27.         (?:\d{3}(?P=separator)?)* # szukanie kolejnych separatorow tego samego rodzaju
  28.         (?P<ulamek>[,\.]?)\d+ # rozpoznanie znaku ulamka
  29.     |
  30.         ([1-9]\d*(?:(?P<ulamek>['.$znakUlamka.'])|(?P<separator>[\040'.$znakSeparatora.']))?\d{3} # "inteligentne" rozpoznanie czy separator czy ulamek
  31.         |
  32.         \d*(?P<ulamek>[,\.]?)\d+) # jest tylko jeden znak ze zbioru [,\.], rozpoznanie znaku ulamka
  33.     )
  34.     $/x';
  35.  
  36.     if (preg_match($porownanie,$txt,$wyniki)) {
  37.         $ulamek = $separator = null;
  38.         if (isset($wyniki["ulamek"]) && $wyniki["ulamek"] != "") $ulamek = $wyniki["ulamek"];
  39.         if (isset($wyniki["separator"]) && $wyniki["separator"] != "") $separator = $wyniki["separator"];
  40.         return Array($ulamek,$separator);
  41.     }
  42.     else return false;
  43. }
  44.  
  45. $tablica = array(
  46.      "1,123", // jesli nie mozna jednoznacznie rozpoznac czy to ulamek czy separator, uzywane sa ustawienia locale systemu
  47.      "0,123", // ulamek
  48.      "10,1231", // ulamek
  49.      "10,123", // jesli nie mozna jednoznacznie rozpoznac czy to ulamek czy separator, uzywane sa ustawienia locale systemu
  50.      "10,12", // ulamek
  51.      "-1",
  52.      ".1",
  53.      ",1",
  54.      "0.1",
  55.      "0,1",
  56.      "0.001",
  57.      "-0.001",
  58.      "1000",
  59.      "1 000",   // tysiac
  60.      "1,000",   // jesli nie mozna jednoznacznie rozpoznac czy to ulamek czy separator, uzywane sa ustawienia locale systemu
  61.      "1.000",   // jesli nie mozna jednoznacznie rozpoznac czy to ulamek czy separator, uzywane sa ustawienia locale systemu
  62.      "1.00",    // jeden
  63.      "1000,0",  // tysiac
  64.      "1 000,000",   // tysiac
  65.      "1.000,000",   // tysiac
  66.      "1,000.000",   // tysiac
  67.      "10.000.000",  // milion
  68.      "10.212.000.000",  // milion
  69.      "1 000 000 000,000", // miliard
  70.      "1 000.000,000", // zla liczba uzyte rozne separatory tysieczne
  71.      "00.1",    // zla liczba
  72.      "1,",  // zla liczba
  73.      "1.",  // zla liczba
  74.      "0 1", // zla liczba
  75.      "0,0.01", // zla liczba
  76.      "00001", // traktuje to jako zla liczba, choc mozna by dodac parametr ZEROFILL :)
  77.      "011", // traktuje to jako zla liczba, choc mozna by dodac parametr ZEROFILL :)
  78.      "aaa", // zla liczba
  79.      "1-1", // zla liczba
  80.      "1-",  // zla liczba
  81.      "1000 0", // zla liczba - separatory zle ustawione
  82.      "1 0000 0000", // zla liczba - separatory zle ustawione
  83.      "- 1"  // dobra liczba jednak funkcja powinna zwrocic spacje jako separator
  84. );
  85.  
  86. setlocale(LC_ALL,"fr");
  87. //setlocale(LC_ALL,"en");
  88. echo "<pre>";
  89. foreach($tablica as $txt) {
  90.     if ($daneLiczby = kukocIsNumeric($txt))
  91.         echo "$txt - ulamek: '{$daneLiczby['0']}', separator: '{$daneLiczby['1']}'\n";
  92.     else
  93.         echo "<b>$txt - to nie liczba.</b>\n";
  94. }
  95. echo "</pre>";
  96. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement