Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kwota słownie - gotowy skrypt, z prośbą o przetestowanie (obsługuje 1-10 do potęgi 45)
ROMeeO
post 29.06.2006, 21:50:56
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 29.06.2006

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


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

Ten post edytował ROMeeO 29.06.2006, 22:14:16
Go to the top of the page
+Quote Post
dr_bonzo
post 29.06.2006, 22:08:18
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Przenosze do odpowiedniego forum.
Gotowe skrypty -> algorytmy i funkcje.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
kicaj
post 29.06.2006, 22:28:01
Post #3





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

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


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

Ten post edytował kicaj 29.06.2006, 22:33:06


--------------------
PHP Developer

"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola
Go to the top of the page
+Quote Post
sf
post 30.06.2006, 07:13:14
Post #4





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


Jeśli chodz o czytelność to proponuje przenieść do pliku ini te tablice winksmiley.jpg


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
ROMeeO
post 30.06.2006, 15:48:39
Post #5





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 29.06.2006

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


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
Go to the top of the page
+Quote Post
SongoQ
post 30.06.2006, 17:02:56
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%)
-----


@ROMeeO Zapoznaj sie z biblioteka pear tam takie cos jest gotowe.


--------------------
Go to the top of the page
+Quote Post
Vertical
post 1.07.2006, 08:51:57
Post #7





Grupa: Zarejestrowani
Postów: 848
Pomógł: 0
Dołączył: 7.07.2004
Skąd: Wrocław

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


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

Ten post edytował Vertical 1.07.2006, 08:55:36
Go to the top of the page
+Quote Post
bim2
post 1.07.2006, 10:50:31
Post #8





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


No własnie, albo 10/100 złotego (lub zł) Dziesięć setnych złotego


--------------------
Go to the top of the page
+Quote Post
mls
post 4.07.2006, 09:58:18
Post #9





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

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


"10/100" i tyle, bez jednostki - chyba tak się zapisuje smile.gif


--------------------
Go to the top of the page
+Quote Post
misiek172
post 7.02.2007, 20:02:28
Post #10





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

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


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)

Ten post edytował misiek172 7.02.2007, 20:05:25


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
mokry
post 8.02.2007, 22:32:22
Post #11





Grupa: Zarejestrowani
Postów: 374
Pomógł: 23
Dołączył: 3.06.2006
Skąd: Katowice

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


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


--------------------
Pomogłem? Podziękuj proszę klikając poniżej "POMÓGŁ" ;)
Go to the top of the page
+Quote Post
rikon
post 12.02.2007, 16:56:23
Post #12





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 27.03.2005

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


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. ?>
Go to the top of the page
+Quote Post
jacekll
post 2.06.2010, 11:21:17
Post #13





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 2.06.2010

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


jeszcze jeden błąd:

21 - powinno być dwadzieścia jeden złotych, nie: dwadzieścia jeden złoty
Go to the top of the page
+Quote Post
Reptile ReX
post 31.05.2012, 20:52:04
Post #14





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 19.01.2008

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


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
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: 19.04.2024 - 11:59