Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kwota zapisana liczbą na zapis słowny
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
soldat
Witam wszystkich.

Napisałem poniższą funkcję do podawania kwoty słownie podczas drukowania przelewów. Działa ona w zakresie 1-999999 (to i tak już o wiele za dużo jak na moje potrzeby), ale bez problemu można ja przerobić tak żeby działała na większych liczbach ( bądź ujemnych smile.gif )


  1. <?
  2.  
  3. $jedn=array(1=>&#092;"jeden\",\"dwa\",\"trzy\",\"cztery\",\"pięć\",\"sześć\",\"siedem\",\"osiem\",\"dziewięć\",\"dziesięć\",\"jedenaście\",\"dwanaście\",
  4. &#092;"trzynaście\",\"czternaście\",\"piętnaście\",\"szesnaście\",\"siedemnaście\",\"osiemnaście\",\"dziewiętnaście\");
  5.  
  6. $dzies=array(2=>&#092;"dwadzieścia\",\"trzydzieści\",\"czterdzieści\",\"pięćdziesiąt\",\"sześćdziesiąt\",\"siedemdziesiąt\",\"osiemdziesiąt\",\"dziewięćdziesiąt\");
  7.  
  8. $setki=array(1=>&#092;"sto\",\"dwieście\",\"trzysta\",\"czterysta\",\"pięćset\",\"sześćset\",\"siedemset\",\"osiemset\",\"dziewięćset\");
  9.  
  10.  
  11. function kwota_slownie($kwota) {
  12.  
  13. global $jedn,$dzies,$setki;  
  14.  
  15. // usuniecie zbednych zer z poczatku ciagu (zeby np. \"009\" bylo zamieniane na \"dziewiec\")
  16. while ($kwota[0]==&#092;"0\") { $kwota=substr($kwota,1,strlen($kwota)); }
  17.  
  18. $str_dl=strlen($kwota);
  19.  
  20. if ($kwota<20) { $slownie=$jedn[$kwota]; }
  21.  
  22. elseif ($kwota<100) { 
  23.  
  24. $j=$kwota[1];  $d=$kwota[0];
  25. $slownie=$dzies[$d].&#092;" \".$jedn[$j];
  26.  
  27. }
  28.  
  29. elseif ($kwota<1000) { 
  30.  
  31. $s=$kwota[0];
  32. $d=substr($kwota,1,$str_dl);
  33. $slownie=$setki[$s].&#092;" \".kwota_slownie($d); 
  34.  
  35. }
  36.  
  37. elseif ($kwota<1000000) {  
  38.  
  39. $d=substr($kwota,-3);
  40. if ($kwota<2000) { $t=&#092;"tysiąc\"; }
  41. elseif ($kwota<5000) { 
  42.  
  43. $jt=$kwota[0];
  44. $t=$jedn[$jt].&#092;" tysiące\";
  45.  
  46. }
  47.  
  48. else { 
  49.  
  50. $jt=substr($kwota,0,$str_dl-3);
  51. $t=kwota_slownie($jt).&#092;" tysięcy\";
  52.  
  53. }
  54.  
  55. $slownie=$t.&#092;" \".kwota_slownie($d);
  56.  
  57. }  
  58.  
  59. // to juz ponad milion - mozna zrobic tak samo jak dla tysiecy
  60. // mi nie było to już potrzebne :)
  61. else { $slownie=$kwota; }
  62.  
  63.  
  64. return($slownie);
  65.  
  66. }
  67.  
  68. ?>


EDIT :

Użycie :

  1. <?
  2.  
  3.  // $suma - zmienna integer 
  4.  // $zlotych_slownie - string
  5.  
  6.  $zlotych_slownie=kwota_slownie($suma);
  7.  
  8. ?>
scanner
Nie podoba mi się:
1. Brak kontroli typu i zakresu parametru funkcji
2. Użycie "global" w tym konkretnym przypadku
3. Linia 16
4. Nieporządek w kodzie.

Propozycja:
Przeanalizuj: http://forum.php.pl/index.php?showtopic=12806 i inne.
soldat
ad. 2 Faktycznie może i bez sensu - tablice mogą być spokojnie zadeklarowane lokalnie w miejscu instrukcji global - raczej nigdzie indziej używane nie będą
ad. 3 Proponuję zamienić linijkę 16 (w sumie to mi też sie nie podoba) na nastepujące :
  1. <?php
  2.  
  3. $kwota=(string)(floor($kwota));
  4. $kwota=ereg_replace(&#092;"^(0)\",\"\",$kwota);
  5.  
  6. ?>

Teraz funkcja bierze pod uwage tylko całkowitą część argumentu (i dobrze)
To w minimalnym choćby stopniu odnosi się również do punktu 1.
ad. 4 questionmark.gif?

Poza tym skrypt ma cenną zaletę : działa :roll2:

Dzięki za uwagi.
modern
a jak zrobić żeby obliczał także grosze?
bardzo prosze o pomoc bo taki skrypcik by mi sie przydał
Spirit86
ReDefine winksmiley.jpg

  1. <?php
  2.  
  3.  $jedn=array(1=>"jeden","dwa","trzy","cztery","pięć","sześć","siedem","osiem","dziewięć","dziesięć","jedenaście","dwanaście",
  4. "trzynaście","czternaście","piętnaście","szesnaście","siedemnaście","osiemnaście","dziewiętnaście");
  5.  
  6. $dzies=array(2=>"dwadzieścia","trzydzieści","czterdzieści","pięćdziesiąt","sześćdziesiąt","siedemdziesiąt","osiemdziesiąt","dziewięćdziesiąt");
  7.  
  8. $setki=array(1=>"sto","dwieście","trzysta","czterysta","pięćset","sześćset","siedemset","osiemset","dziewięćset");
  9.  
  10.  
  11. function kwota_slownie($kwota) {
  12.  
  13. global $jedn,$dzies,$setki;
  14.  
  15. // usuniecie zbednych zer z poczatku ciagu (zeby np. "009" bylo zamieniane na "dziewiec")
  16. while ($kwota[0]=="0") { $kwota=substr($kwota,1,strlen($kwota)); }
  17.  
  18. /* --- GROSZE --- */
  19. if(eregi('.', $kwota))
  20. {
  21. $groszy = end(explode('.', $kwota));
  22. $slownie_groszy = kwota_slownie($groszy);
  23. switch($groszy)
  24. {
  25.  case 0:
  26. $slownie_groszy = '';
  27.  break;
  28.  case 1:
  29. $slownie_groszy = 'jeden grosz';
  30. break;
  31.  default:
  32.  $slownie_groszy .= 'groszy';
  33. }
  34.  
  35. $str_dl=strlen($kwota);
  36.  
  37. if ($kwota<20) { $slownie=$jedn[$kwota]; }
  38.  
  39. elseif ($kwota<100) {
  40.  
  41. $j=$kwota[1];  $d=$kwota[0];
  42. $slownie=$dzies[$d]." ".$jedn[$j];
  43.  
  44. }
  45.  
  46. elseif ($kwota<1000) {
  47.  
  48. $s=$kwota[0];
  49. $d=substr($kwota,1,$str_dl);
  50. $slownie=$setki[$s]." ".kwota_slownie($d);
  51.  
  52. }
  53.  
  54. elseif ($kwota<1000000) {
  55.  
  56. $d=substr($kwota,-3);
  57. if ($kwota<2000) { $t="tysiąc"; }
  58. elseif ($kwota<5000) {
  59.  
  60. $jt=$kwota[0];
  61. $t=$jedn[$jt]." tysiące";
  62.  
  63. }
  64.  
  65. else {
  66.  
  67. $jt=substr($kwota,0,$str_dl-3);
  68. $t=kwota_slownie($jt)." tysięcy";
  69.  
  70. }
  71.  
  72. $slownie=$t." ".kwota_slownie($d);
  73.  
  74. }
  75.  
  76. // to juz ponad milion - mozna zrobic tak samo jak dla tysiecy
  77. // mi nie było to już potrzebne :)
  78. else { $slownie=$kwota; }
  79.  
  80.  
  81. return($slownie.$slownie_groszy);
  82.  
  83. }
  84.  
  85. ?>

Pisałem z palca po uczelni, więc mogą być błędy winksmiley.jpg
SongoQ
Polecam skorzystanie z PEAR
http://pear.php.net/package/Numbers_Words
kotkon
Funkcja powyzsza w php powoduje mi reset polaczenia z serwerem
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.