Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Poprawny numer NIP, REGON lun PESEL
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
ghostrider
potrzebowałem, nie mogłem znaleźć, napisałem

  1. <?php
  2.  
  3. function is_nip($nr)
  4. {
  5. if ($nr === NULL || empty($nr)) return false;
  6. $weights = array (6, 5, 7, 2, 3, 4, 5, 6, 7) ;
  7. if ( preg_match_all("/d/", $nr, $digits) )
  8. {
  9. $digits = $digits[0];
  10. if ( count($digits)-!= count($weights) ) return false;
  11. $ctrl_digit = (int) array_pop($digits);
  12. $all_sum  = (int) 0;
  13. foreach ( $digits as $digit )
  14. {
  15. $weight  = (int) current($weights);
  16. $all_sum += (int) $digit * $weight;
  17. next($weights);
  18. }
  19. $calc_ctrl = (int) ($all_sum % 11 == 10) ? 0 : $all_sum % 11;
  20. if ($calc_ctrl == $ctrl_digit) return true;
  21. } 
  22. return false; 
  23. }
  24. ?>


sprawdzilem na 1553 numerach NIP, tylko tyle posiadam i funkcjonuje ok.
ale człowiek omylne zwierze wiec uwagi, poprawki, sugestie, pytania bedą mile widziane.

użycie
Kod
sprawdza poprawność podanego numeru NIP
bool is_nip (string nr)


nie trzeba sie martwić o forme wpisywania numeru tzn: może byc XXX-XX-XX-XXX albo XXXXXXXXXX, albo jakikolwiek zestaw znaków zawierający jednak 10 cyfr
mike
Proszę w opisie tematu dopisać wymagane informacje zgodne z zasadami pisania na tym forum.
ghostrider
mike_mech: dzieki za wskazenie drogi co do tematu posta winksmiley.jpg

powyzsza funkcja zyskala poszerzona funkcjonalnosc, i teraz sprawdza poprawnosc numerow: NIP, REGON, PESEL, zmienila tez nazwe, poprawiłem tez małe niedopatrzenie .
Cytat
if ($nr === NULL && empty($nr)) return false;

poprawiono na
  1. <?php
  2. ($nr === NULL || empty($nr))
  3. ?>

oki, kod:
  1. <?php
  2.  
  3. function is_evidence_nr($nr, $type=0)
  4. {
  5. if ($nr === NULL || empty($nr)) return false;
  6.  
  7. $types = array(0 => "NIP", 1 => "REGON", 2 => "PESEL");
  8.  
  9. if ( !array_key_exists($type, $types) ) return false;
  10. else $type = (string) $types[$type];
  11.  
  12. $weights["NIP"]  = array (6, 5, 7, 2, 3, 4, 5, 6, 7) ;
  13. $weights["REGON_7"] = array (2, 3, 4, 5, 6, 7) ;
  14. $weights["REGON_9"] = array (8, 9, 2, 3, 4, 5, 6, 7) ;
  15. $weights["PESEL"] = array (1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
  16.  
  17. $mods["NIP"] = (int) 11;
  18. $mods["REGON"] = (int) 11;
  19. $mods["PESEL"] = (int) 10;
  20.  
  21. if ( preg_match_all("/d/", $nr, $digits) )
  22. {
  23. $digits  = $digits[0];
  24.  
  25. if ($type == "REGON") {
  26. $digits_count = count($digits);
  27. if ($digits_count != 9 && $digits_count != 7) return false;
  28. $idx = (string) sprintf("%s_%d", $type, $digits_count);
  29. }
  30. else $idx = (string) $type;
  31.  
  32. $weights  = $weights[$idx];
  33. $mods = $mods[$type];
  34.  
  35. if ( count($digits)-!= count($weights) ) return false;
  36. $ctrl_digit = (int) array_pop($digits);
  37. $all_sum  = (int) 0;
  38. foreach ( $digits as $digit )
  39. {
  40. $weight  = (int) current($weights);
  41. $all_sum += (int) $digit * $weight;
  42. next($weights);
  43. }
  44. $calc_ctrl = (int) ($all_sum % $mods == 10) ? 0 : $all_sum % $mods;
  45. if ($type == "PESEL") $calc_ctrl = (int) (10 - ($all_sum % $mods) == 10) ? 0 : 10 - ($all_sum % $mods) ;
  46. if ($calc_ctrl == $ctrl_digit) return true;
  47. } 
  48. return false; 
  49. }
  50.  
  51. ?>


uzycie :
Kod
sprawdza poprawność podanego numeru NIP, REGON lub PESEL
bool is_evidence_nr(string nr, [int typ] )


typ to 0,1 lub 2 odpowiednio dla NIP, REGON lub PESEL
domyslnie typ = 0, czyli NIP
nospor
Co do poprawnosci walidacji to nie wiem, nie sprawdzalem. Ale zaciekawil mnie kod:
  1. <?php
  2.  
  3. $mods["NIP"] = (int) 11;
  4. $mods["REGON"] = (int) 11;
  5. $mods["PESEL"] = (int) 10;
  6.  
  7. ?>


Po co rzutujesz int na int? Co innego gdyby bylo
  1. <?php
  2.  
  3. $mods["NIP"] = (int) '11';
  4. $mods["REGON"] = (int) '11';
  5. $mods["PESEL"] = (int) '10';
  6.  
  7. ?>

Ale w obecnej sytuacji te rzutowanie jest zbedne
ghostrider
masz racje, zbęde, jakos tak zostało. W pierwotnej wersji funckcji, to było podawane jako parametr, wiec rzutowalem. nie poprawilem.
Dobra uwaga.

[OT] @nospor: trzymaj sie [/OT]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.