Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kwota zapisana liczbą na zapis słowny, Funkcja, PHP 4 i 5
soldat
post 15.03.2005, 10:24:04
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 14.03.2005
Skąd: W-wa

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował soldat 15.03.2005, 11:01:49
Go to the top of the page
+Quote Post
scanner
post 15.03.2005, 14:17:09
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
soldat
post 15.03.2005, 14:53:10
Post #3





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 14.03.2005
Skąd: W-wa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
modern
post 15.10.2005, 19:00:42
Post #4





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 2.10.2005

Ostrzeżenie: (20%)
X----


a jak zrobić żeby obliczał także grosze?
bardzo prosze o pomoc bo taki skrypcik by mi sie przydał
Go to the top of the page
+Quote Post
Spirit86
post 18.10.2005, 14:47:56
Post #5





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
SongoQ
post 18.10.2005, 15:06:03
Post #6





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Polecam skorzystanie z PEAR
http://pear.php.net/package/Numbers_Words


--------------------
Go to the top of the page
+Quote Post
kotkon
post 27.12.2005, 12:58:07
Post #7





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 15.04.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Funkcja powyzsza w php powoduje mi reset polaczenia z serwerem


--------------------
-------------
Gustaw
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 05:08