Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kwota słownie - gotowy skrypt
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
ROMeeO
Napisałem sobie funkcyjkę do obsługi dowolnej kwoty. Ta akurat obsługuje aż do septyliardów, czyli 10 do potęgi 45, ale można ją rozwinąć dowolnie.
Jakby ktoś chciał potestować, to bardzo proszę.
Kwotę zwraca w formacie:
1234,56 - jeden tysiąc dwieście trzydzieści cztery złote 56/100 gr.
grosze oczywiście można jeszcze dorobić słownie, ale mi akurat w takim formacie było potrzebne.
  1. <?php
  2. function slownie ($kw) {
  3.  
  4. $t_a = array('','sto','dwieście','trzysta','czterysta','pięćset','sześćset','siedemset','osiemset','dziewięćset');
  5. $t_b = array('','dziesięć','dwadzieścia','trzydzieści','czterdzieści','pięćdziesiąt','sześćdziesiąt','siedemdziesiąt','osiemdziesiąt','dziewięćdziesiąt');
  6. $t_c = array('','jeden','dwa','trzy','cztery','pięć','sześć','siedem','osiem','dziewięć');
  7. $t_d = array('dziesięć','jedenaście','dwanaście','trzynaście','czternaście','piętnaście','szesnaście','siednaście','osiemnaście','dziewiętnaście');
  8.  
  9. $t_kw_15 = array('septyliard','septyliardów','septyliardy');
  10. $t_kw_14 = array('septylion','septylionów','septyliony');
  11. $t_kw_13 = array('sekstyliard','sekstyliardów','sekstyliardy');
  12. $t_kw_12 = array('sekstylion','sekstylionów','sepstyliony');
  13. $t_kw_11 = array('kwintyliard','kwintyliardów','kwintyliardy');
  14. $t_kw_10 = array('kwintylion','kwintylionów','kwintyliony');
  15. $t_kw_9 = array('kwadryliard','kwadryliardów','kwaryliardy');
  16. $t_kw_8 = array('kwadrylion','kwadrylionów','kwadryliony');
  17. $t_kw_7 = array('tryliard','tryliardów','tryliardy');
  18. $t_kw_6 = array('trylion','trylionów','tryliony');
  19. $t_kw_5 = array('biliard','biliardów','biliardy');
  20. $t_kw_4 = array('bilion','bilionów','bilony');
  21. $t_kw_3 = array('miliard','miliardów','miliardy');
  22. $t_kw_2 = array('milion','milionów','miliony');
  23. $t_kw_1 = array('tysiąc','tysięcy','tysiące');
  24. $t_kw_0 = array('złoty','złotych','złote');
  25.  
  26. if ($kw!='') {
  27. $kw=(substr_count($kw,',')==0) ? $kw.',00':$kw;
  28. $tmp=explode(",",$kw);
  29. $ln=strlen($tmp[0]);
  30. $tmp_a=($ln%3==0) ? (floor($ln/3)*3):((floor($ln/3)+1)*3);
  31. for($i = $ln; $i < $tmp_a; $i++) {
  32. $l_pad .= '0';
  33. $kw_w = $l_pad . $tmp[0];
  34. }
  35. $kw_w=($kw_w=='') ? $tmp[0]:$kw_w;
  36. $paczki=(strlen($kw_w)/3)-1;
  37. $p_tmp=$paczki;
  38. for($i=0;$i<=$paczki;$i++) {
  39. $t_tmp='t_kw_'.$p_tmp;
  40. $p_tmp--;
  41. $p_kw=substr($kw_w,($i*3),3);
  42. $kw_w_s=($p_kw{1}!=1) ? $t_a[$p_kw{0}].' '.$t_b[$p_kw{1}].' '.$t_c[$p_kw{2}]:$t_a[$p_kw{0}].' '.$t_d[$p_kw{2}];
  43. if(($p_kw{0}==0)&&($p_kw{2}==1)&&($p_kw{1}<1)) $ka=${$t_tmp}[0]; //możliwe że $p_kw{1}!=1
  44. else if (($p_kw{2}>&& $p_kw{2}<5)&&$p_kw{1}!=1) $ka=${$t_tmp}[2];
  45. else $ka=${$t_tmp}[1];
  46. $kw_slow.=$kw_w_s.' '.$ka.' ';
  47. }
  48. }
  49. $text = $kw_slow.' '.$tmp[1].'/100 gr.';
  50. return $text;
  51. }
  52.  
  53. echo slownie('12345678910111213141516171819202122232425262728,56');
  54. ?>


Pozdrawiam
dr_bonzo
Przenosze do odpowiedniego forum.
Gotowe skrypty -> algorytmy i funkcje.
kicaj
1234,56
jeden tysiąc dwieście trzydzieści cztery złote 56/100 gr.
# jeden tysiac brzydko brzmi, ale musi byc:p
# 56/100 gr. dlaczego w ten sposob?questionmark.gif

2,00
dwa złote 00/100 gr.
# wyeliminowac grosze w takim przypadku

12,42
dwanaście złotych 42/100 gr.
#ok

54434,433
pięćdziesiąt cztery tysiące czterysta trzydzieści cztery złote 433/100 gr.
# przyklad z ciekawosci

545,11
pięćset czterdzieści pięć złotych 11/100 gr.
# ok

1111,11
jeden tysiąc sto jedenaście złotych 11/100 gr.
# podobnie jak w 1. przykładzie
# nie wiem czy dopuszczalne byloby: tysiac sto jedensacie zlotych

1,01
jeden złoty 01/100 gr.
# ok

0,25
złotych 25/100 gr.
# sypie sie przy 0zl
# proponuje: zero złotych, 25 gr. lub poprostu: 25 gr

0,00
złotych 00/100 gr.
# jw.

Ogolnie poprawnie sie zachowuje, grosze takze moglby byc "pisane" smile.gif
Na poczatku zdefiniuj zmienne $l_pad i $kw_slow bo wyskakuja Notice.
Jednak popracowalbym nad kodem, nazwenictwem zmiennych oraz czytelnosc lezy...
sf
Jeśli chodz o czytelność to proponuje przenieść do pliku ini te tablice winksmiley.jpg
ROMeeO
Niom w sumie zadefiniowanie zmiennych możnaby zrobić.
Co do 00/100 gr. to jest mi potrzebne w takiej formie, bo taki był wymóg klienta. Zresztą to można w prosty sposób przerobić.
Ale dziękówka za wszelkie wskazówki, zwłaszcza 433/100 gr. mi się podobało, już sobie to poprawiłem. Mam tylko mały problem z tym "jeden tysiąc (...)" ale już mi się nasuwa rozwiązanie.

Innymi słowy jeszcze trochę powalczę i będzie OK.

Pozdrawiam.

--
1) Nie ma rzeczy niemożliwych, są tylko nie odkryte jeszcze rozwiązania.
2) Z problemami jest jak z kobietami, trzeba się z nimi przespać.
3) Rozwiązanie problemów jest sumą rzeczy powtarzalnych
SongoQ
@ROMeeO Zapoznaj sie z biblioteka pear tam takie cos jest gotowe.
Vertical
Input: 100,1
Output: sto złotych 1/100 gr.
* Po pierwsze: powinno wyskoczyć sto złotych 10/100 gr
* Po drugie: może czepiam się szczegółów, ale chyba jest mały błąd w zapisie. Lepiej by brzmiało sto złotych 10 gr, bo w orginale wygląda to trochę jakby kwota była z ułamkiem grosza na końcu
bim2
No własnie, albo 10/100 złotego (lub zł) Dziesięć setnych złotego
mls
"10/100" i tyle, bez jednostki - chyba tak się zapisuje smile.gif
misiek172
jeszczze mozna dołożyć opcje, aby działało pod kodowaniem iso, czyli:

  1. <?php
  2. $x = array('ś', 'ą', 'Ś');
  3. $x_za = array('&para;', '&plusmn;', '&brvbar;');
  4. for($i=0;$i<count($x);$i++){
  5. $slownie = str_replace($x[$i], $x_za[$i], $slownie);
  6. }
  7. ?>


//zamiast &para &plusmnb &brvbar powinno być inne znaczki lecz skrypt na forum zamienia je na te teksty... powinno być według położena w tablicy ANSI characeter: 182(B6), 177(B1), 166(A6)
mokry
Cóż zamiast pisać kilka nowych linijek kody, lepiej zmienić w źródle samej funkcji... szybsze i wygodniejsze... jeśli chciałbym to jednak robić w ten Twój sposób to optymalniej to zrobić w jednej linijce (wyr. regularne)...
rikon
Cytat(misiek172 @ 7.02.2007, 19:02:28 ) *
jeszczze mozna dołożyć opcje, aby działało pod kodowaniem iso, czyli:

  1. <?php
  2. $x = array('ś', 'ą', 'Ś');
  3. $x_za = array('&para;', '&plusmn;', '&brvbar;');
  4. for($i=0;$i<count($x);$i++){
  5. $slownie = str_replace($x[$i], $x_za[$i], $slownie);
  6. }
  7. ?>


//zamiast &para; &plusmn;b &brvbar; powinno być inne znaczki lecz skrypt na forum zamienia je na te teksty... powinno być według położena w tablicy ANSI characeter: 182(B6), 177(B1), 166(A6)


a nie lepiej tak? będzie szybciej i prościej

  1. <?php
  2. $x = array('ś', 'ą', 'Ś');
  3. $x_za = array('&para;', '&plusmn;', '&brvbar;');
  4. $slownie = str_replace($x, $x_za, $slownie);
  5. ?>
jacekll
jeszcze jeden błąd:

21 - powinno być dwadzieścia jeden złotych, nie: dwadzieścia jeden złoty
Reptile ReX
Może i temat stary (za co przepraszam), ale moja wiadomość jest jak najbardziej na
topie dla szukających sposobu na konwersję kwoty na postać
słowną w języku PHP.

Chciałbym zaprezentować wam mój projekt o nazwie Kwota Słownie

Biblioteka Kwota Słownie
Kwota słownie jest projektem wciąż rozwijanej biblioteki
napisanej w języku PHP 5 służącej do konwertowania kwoty
z postaci liczbowej na postać słowną, uwzględniając
poprawność językową oraz prawidłową odmianę w języku
polskim.


Biblioteka dzięki swojej uniwersalności sama dostosowuje się
pod użytkowników
, użytkownik może sam zdecydować jaką
walutę chcę wyświetlać, oraz w jakim formacie prezentować
kwotę zdawkową czyli np. grosze – czy w postaci słownej tak jak
kwota podstawowa, czy być może jako liczba w postaci: 10/100,
20/100 itd.

Jeżeli szukasz rozwiązania dla swojej firmy lub jesteś
programistą, który poszukuję rozwiązania, które pozwoli na
wyświetlanie na fakturach kwoty słownej, to dobrze trafiłeś, nie
czekaj ani chwili dłużej...

Download oraz więcej informacji na
http://www.kwotaslownie.pl

Dodam, że biblioteka jest udostępniania na licencji LPGL
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-2024 Invision Power Services, Inc.