Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [gotowa funkcja] Liczba słownie
BzikOS
post 2.03.2004, 15:49:17
Post #1





Grupa: Przyjaciele php.pl
Postów: 660
Pomógł: 0
Dołączył: 28.08.2002
Skąd: Starachowice

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


Zainspirowany jednym z tematów na forum spróbowałem napisać własną funkcję do zamiany liczby na jej słowną reprezentację. Oto do czego doszedłem:

  1. <?php
  2. function d2w( $digits )
  3. {
  4. $jednosci = Array( 'zero', 'jeden', 'dwa', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć' );
  5. $dziesiatki = Array( '', 'dziesięć', 'dwadzieścia', 'trzydzieści', 'czterdzieści', 'piećdziesiąt', 'sześćdziesiąt', 'siedemdziesiąt', 'osiemdziesiąt', 'dziewiećdziesiąt' );
  6. $setki = Array( '', 'sto', 'dwieście', 'trzysta', 'czterysta', 'piećset', 'sześćset', 'siedemset', 'osiemset', 'dziewiećset' );
  7. $nastki = Array( 'dziesieć', 'jedenaście', 'dwanaście', 'trzynaście', 'czternaście', 'piętnaście', 'szesnaście', 'siedemnaście', 'osiemnaście', 'dzięwietnaście' );
  8. $tysiace = Array( 'tysiąc', 'tysiące', 'tysięcy' );
  9.  
  10. $digits = (string) $digits;
  11. $digits = strrev( $digits );
  12. $i = strlen( $digits );
  13.  
  14. $string = '';
  15.  
  16. if( $i > 5 && $digits[5] > 0 )
  17. $string .= $setki[ $digits[5] ] . ' ';
  18. if( $i > 4 && $digits[4] > 1 )
  19. $string .= $dziesiatki[ $digits[4] ] . ' ';
  20. elseif( $i > 3 && $digits[4] == 1 )
  21. $string .= $nastki[$digits[3]] . ' ';
  22. if( $i > 3 && $digits[3] > 0 && $digits[4] != 1 )
  23. $string .= $jednosci[ $digits[3] ] . ' ';
  24.  
  25. $tmpStr = substr( strrev( $digits ), 0, -);
  26. if( strlen( $tmpStr ) > 0 )
  27. {
  28. $tmpInt = (int) $tmpStr;
  29. if( $tmpInt == 1 )
  30. $string .= $tysiace[0] . ' ';
  31. elseif( ( $tmpInt % 10 > 1 && $tmpInt % 10 < 5 ) && ( $tmpInt < 10 || $tmpInt > 20 ) )
  32. $string .= $tysiace[1] . ' ';
  33. else
  34. $string .= $tysiace[2] . ' ';
  35. }
  36.  
  37. if( $i > 2 && $digits[2] > 0 )
  38. $string .= $setki[$digits[2]] . ' ';
  39. if( $i > 1 && $digits[1] > 1 )
  40. $string .= $dziesiatki[$digits[1]] . ' ';
  41. elseif( $i > 0 && $digits[1] == 1 )
  42. $string .= $nastki[$digits[0]] . ' ';
  43. if( $digits[0] > 0 && $digits[1] != 1 )
  44. $string .= $jednosci[$digits[0]] . ' ';
  45.  
  46. return $string;
  47. }
  48. ?>


Ponieważ pisałem ją naprędce w pracy winksmiley.jpg może zawierać błędy, jeżeli takowe ktos znajdzie, bardzo proszę o info w tym wątku.

Aha funkcja działa dla przedziału liczbowego od 1 - 999999.
Go to the top of the page
+Quote Post
spenalzo
post 2.03.2004, 17:44:29
Post #2





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

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


Khem...

1023,43 = dwadzie¶cia trzy tysi±ce czterdzie¶ci trzy
0,43 = tysięcy czterdzie¶ci trzy
1,43 = jeden tysi±c czterdzie¶ci trzy

Chciałem zauważyć, że w Polsce używa się , do rozdzielania wartości dziesiętnych od całości winksmiley.jpg

Update: nieważne czy , czy . - i tak źle :-)


--------------------

Go to the top of the page
+Quote Post
BzikOS
post 2.03.2004, 17:50:56
Post #3





Grupa: Przyjaciele php.pl
Postów: 660
Pomógł: 0
Dołączył: 28.08.2002
Skąd: Starachowice

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


Khem. Deklaracja funkcji:

string <b>d2w</b>( int liczba )

Ale specjalnie dla Ciebie speniu:

  1. <?php
  2. $kwota = 1023.43;
  3.  
  4. $kwotaArr = explode( '.', $kwota );
  5. print( d2w( $kwotaArr[0] ) . ' złote i ' . d2w( $kwotaArr[1] ) . 'grosze' );
  6. ?>
Go to the top of the page
+Quote Post
spenalzo
post 2.03.2004, 18:03:54
Post #4





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

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


Khem khem...
Cytat
Khem. Deklaracja funkcji:

string d2w( int liczba )

ale to nigdzie nie było napisane biggrin.gif/

Z liczbami całkowitymi działa OK tongue.gif


--------------------

Go to the top of the page
+Quote Post
xmarko
post 3.03.2004, 14:53:35
Post #5





Grupa: Zarejestrowani
Postów: 59
Pomógł: 0
Dołączył: 26.02.2004

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


a jak bedzie wyglądał zapis skryptu do pokazania kwoty w zapisie
np 12,50 :
a to wynik:
dwanascie złotych 50/100
?


--------------------
marko
Go to the top of the page
+Quote Post
BzikOS
post 3.03.2004, 17:46:34
Post #6





Grupa: Przyjaciele php.pl
Postów: 660
Pomógł: 0
Dołączył: 28.08.2002
Skąd: Starachowice

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


Bez przesady....

  1. <?php
  2. $kwota = '12,50';
  3.  
  4. $kwotaArr = explode( ',', $kwota );
  5. print( d2w( $kwotaArr[0] ) . ' złotych ' . $kwotaArr[1] . '/100' ); 
  6. ?>

ehh..
Go to the top of the page
+Quote Post
kszychu
post 4.03.2004, 10:28:45
Post #7





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

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


No właśnie bez przesady laugh.gif A tak w ogóle to dzięki BzikOS! Zeby jeszcze udało mi się rozwiązać problem numeracji stron, to fakturkę miałbym już zrobioną...


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
phpion
post 18.08.2009, 13:59:57
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




A oto moja wersja funkcji "liczba słownie". Jest akurat w postaci helpera do Kohana ale można ją wykorzystać jako zwykłą funkcję (nie korzysta z żadnych zależności). Mam koncepcję jak napisać to bardziej elegancko ale wpadłem na to trochę za późno smile.gif hehe. Obsługuje liczby od 0 do 9999999.
  1. <?php
  2. /**
  3.  * Rozszerza klasę num o dodatkowe funkcjonalności.
  4.  *
  5.  * @package helpers
  6.  * @author Michał "phpion" Płonka
  7.  */
  8. class num extends num_Core {
  9. /**
  10. * Zwraca słowną reprezentację liczby.
  11. *
  12. * Obsługuje liczby od 0 do 9999999.
  13. *
  14. * @param int $number Liczba.
  15. * @param string $imploder Ciag znaków jakim zostaną połączone ze sobą poszczególne segementy liczby.
  16. * @return string Słowna reprezentacja liczby.
  17. */
  18. public static function say($number, $imploder = ' ') {
  19. $number = (int)$number;
  20.  
  21. if ($number == 0) {
  22. return 'zero';
  23. }
  24.  
  25. $levels = array(
  26. '0' => array('', 'jeden', 'dwa', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć'),
  27. '0a' => array('', 'jedenaście', 'dwanaście', 'trzynaście', 'czternaście', 'piętnaście', 'szesnaście', 'siedemnaście', 'osiemnaście', 'dziewiętnaście'),
  28. '1' => array('', 'dziesięć', 'dwadzieścia', 'trzydzieści', 'czterdzieści', 'pięćdziesiąt', 'sześćdziesiąt', 'siedemdziesiąt', 'osiemdziesiąt', 'dziewięćdziesiąt'),
  29. '2' => array('', 'sto', 'dwieście', 'trzysta', 'czterysta', 'pięćset', 'sześćset', 'siedemset', 'osiemset', 'dziewięćset'),
  30. '3' => array('', 'jeden tysiąc', 'dwa tysiące', 'trzy tysiące', 'cztery tysiące', 'pięć tysięcy', 'sześć tysięcy', 'siedem tysięcy', 'osiem tysięcy', 'dziewięć tysięcy'),
  31. '3a' => array('', 'jedenaście tysięcy', 'dwanaście tysięcy', 'trzynaście tysięcy', 'czternaście tysięcy', 'piętnaście tysięcy', 'szesnaście tysięcy', 'siedemnaście tysięcy', 'osiemnaście tysięcy', 'dziewiętnaście tysięcy'),
  32. '4' => array('', 'dziesięć tysięcy', 'dwadzieścia tysięcy', 'trzydzieści tysięcy', 'czterdzieści tysięcy', 'pięćdziesiąt tysięcy', 'sześćdziesiąt tysięcy', 'siedemdziesiąt tysięcy', 'osiemdziesiąt tysięcy', 'dziewięćdziesiąt tysięcy'),
  33. '5' => array('', 'sto tysięcy', 'dwieście tysięcy', 'trzysta tysięcy', 'czterysta tysięcy', 'pięćset tysięcy', 'sześćset tysięcy', 'siedemset tysięcy', 'osiemset tysięcy', 'dziewięćset tysięcy'),
  34. '6' => array('', 'jeden milion', 'dwa miliony', 'trzy miliony', 'cztery miliony', 'pięć milionów', 'sześć milionów', 'siedem milionów', 'osiem milionów', 'dziewięć milionów')
  35. );
  36.  
  37. $return = array();
  38. $skip_next_level = FALSE;
  39.  
  40. $number = (string)$number;
  41.  
  42. // Pętla przypisująca słowne odpowiedniki cyfrom na określonych miejscach.
  43. for ($i=0, $strlen=strlen($number); $i<$strlen; $i++) {
  44. if ($skip_next_level === TRUE) {
  45. $return[] = '';
  46. $skip_next_level = FALSE;
  47.  
  48. continue;
  49. }
  50.  
  51. $l = $strlen - $i - 1;
  52. $n = (int)$number[$i];
  53.  
  54. if ($n == 1 && isset($levels[($l - 1).'a'])) {
  55. $next_number = (int)$number[$i + 1];
  56.  
  57. if ($next_number != 0) {
  58. $l = ($l - 1).'a';
  59. $n = (int)$number[$i + 1];
  60. }
  61.  
  62. $return[] = $levels[$l][(string)$n];
  63.  
  64. $skip_next_level = TRUE;
  65. }
  66. else {
  67. $return[] = $levels[$l][(string)$n];
  68. }
  69. }
  70. //
  71.  
  72. // Usunięcie powtórzeń typu "sto tysięcy jedenaście tysięcy" do postaci "sto jedenaście tysięcy".
  73. $c = 0;
  74. $remove_after_space = FALSE;
  75.  
  76. for ($i=$strlen-1; $i>=0; $i--) {
  77. $strpos = strpos($return[$i], ' ');
  78.  
  79. if ($strpos > 0) {
  80. if ($remove_after_space === TRUE) {
  81. $return[$i] = substr($return[$i], 0, $strpos);
  82. }
  83. else {
  84. $remove_after_space = TRUE;
  85. }
  86. }
  87.  
  88. if ($c == 2) {
  89. $remove_after_space = FALSE;
  90. $c = 0;
  91. }
  92. else {
  93. $c++;
  94. }
  95. }
  96. //
  97.  
  98. return implode($imploder, $return);
  99. }
  100. }

I przykład działania:
Kod
1 jeden
2 dwa
5 pięć
10 dziesięć
11 jedenaście
17 siedemnaście
20 dwadzieścia
21 dwadzieścia jeden
25 dwadzieścia pięć
100 sto
101 sto jeden
102 sto dwa
110 sto dziesięć
111 sto jedenaście
119 sto dziewiętnaście
123 sto dwadzieścia trzy
170 sto siedemdziesiąt
1000 jeden tysiąc
1001 jeden tysiąc jeden
1010 jeden tysiąc dziesięć
1111 jeden tysiąc sto jedenaście
1125 jeden tysiąc sto dwadzieścia pięć
6666 sześć tysięcy sześćset sześćdziesiąt sześć
10000 dziesięć tysięcy
10001 dziesięć tysięcy jeden
10010 dziesięć tysięcy dziesięć
12345 dwanaście tysięcy trzysta czterdzieści pięć
100000 sto tysięcy
100001 sto tysięcy jeden
100011 sto tysięcy jedenaście
120000 sto dwadzieścia tysięcy
111111 sto jedenaście tysięcy sto jedenaście
7654321 siedem milionów sześćset pięćdziesiąt cztery tysiące trzysta dwadzieścia jeden
9876543 dziewięć milionów osiemset siedemdziesiąt sześć tysięcy pięćset czterdzieści trzy
9000001 dziewięć milionów jeden
9999999 dziewięć milionów dziewięćset dziewięćdziesiąt dziewięć tysięcy dziewięćset dziewięćdziesiąt dziewięć
Go to the top of the page
+Quote Post
Wicepsik
post 18.08.2009, 14:35:09
Post #9





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

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


http://4programmers.net/PHP/FAQ/Jak_zamien...C5%82own%C4%85_

osiemset czterdzieści jeden miliardów dwieście pięć milionów czterysta osiemdziesiąt sześć tysięcy siedemset pięćdziesiąt pięć


--------------------
Go to the top of the page
+Quote Post
sarin28
post 19.07.2010, 12:09:31
Post #10





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 13.10.2008

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


2839 - tysiące osiemset trzydzieści dziewięć

po zmodyfikowaniu linijki

  1.  
  2. elseif( $i > 3 && isSet($digits[4]) && $digits[4] == 1 )
  3. {
  4. $string .= $nastki[$digits[3]] . ' ';
  5. }
  6. if( $i > 3 && $digits[3] > 0 && isSet($digits[4]) && $digits[4] != 1 )
  7. {
  8.  
  9. $string .= $jednosci[ $digits[3] ] . ' ';
  10. }


na

  1. elseif( $i > 3 && isSet($digits[4]) && $digits[4] == 1 )
  2. {
  3. $string .= $nastki[$digits[3]] . ' ';
  4. }
  5. elseif( $i > 3 && $digits[3] > 0)
  6. {
  7.  
  8. $string .= $jednosci[ $digits[3] ] . ' ';
  9. }


działa poprawnie, ale nie miałem czasu przetestować czy bez tego ifa na innych liczbach sie nie wykrzacza.

Pozdrawiam
Powód edycji: [thek]: Nie odgrzebujemy trupów sprzed roku ;)
Go to the top of the page
+Quote Post
pyrrhias
post 23.11.2010, 01:15:53
Post #11





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

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


Witam,

Bardzo ladny te classa num ale jak znalesc classa num_Core ? Bardzo prosze o pomoc.

Pozdrawiam


Cytat(phpion @ 18.08.2009, 13:59:57 ) *
A oto moja wersja funkcji "liczba słownie". Jest akurat w postaci helpera do Kohana ale można ją wykorzystać jako zwykłą funkcję (nie korzysta z żadnych zależności). Mam koncepcję jak napisać to bardziej elegancko ale wpadłem na to trochę za późno smile.gif hehe. Obsługuje liczby od 0 do 9999999.
  1. <?php
  2. /**
  3.  * Rozszerza klasę num o dodatkowe funkcjonalności.
  4.  *
  5.  * @package helpers
  6.  * @author Michał "phpion" Płonka
  7.  */
  8. class num extends num_Core {
  9. /**
  10. * Zwraca słowną reprezentację liczby.
  11. *
  12. * Obsługuje liczby od 0 do 9999999.
  13. *
  14. * @param int $number Liczba.
  15. * @param string $imploder Ciag znaków jakim zostaną połączone ze sobą poszczególne segementy liczby.
  16. * @return string Słowna reprezentacja liczby.
  17. */
  18. public static function say($number, $imploder = ' ') {
  19. $number = (int)$number;
  20.  
  21. if ($number == 0) {
  22. return 'zero';
  23. }
  24.  
  25. $levels = array(
  26. '0' => array('', 'jeden', 'dwa', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć'),
  27. '0a' => array('', 'jedenaście', 'dwanaście', 'trzynaście', 'czternaście', 'piętnaście', 'szesnaście', 'siedemnaście', 'osiemnaście', 'dziewiętnaście'),
  28. '1' => array('', 'dziesięć', 'dwadzieścia', 'trzydzieści', 'czterdzieści', 'pięćdziesiąt', 'sześćdziesiąt', 'siedemdziesiąt', 'osiemdziesiąt', 'dziewięćdziesiąt'),
  29. '2' => array('', 'sto', 'dwieście', 'trzysta', 'czterysta', 'pięćset', 'sześćset', 'siedemset', 'osiemset', 'dziewięćset'),
  30. '3' => array('', 'jeden tysiąc', 'dwa tysiące', 'trzy tysiące', 'cztery tysiące', 'pięć tysięcy', 'sześć tysięcy', 'siedem tysięcy', 'osiem tysięcy', 'dziewięć tysięcy'),
  31. '3a' => array('', 'jedenaście tysięcy', 'dwanaście tysięcy', 'trzynaście tysięcy', 'czternaście tysięcy', 'piętnaście tysięcy', 'szesnaście tysięcy', 'siedemnaście tysięcy', 'osiemnaście tysięcy', 'dziewiętnaście tysięcy'),
  32. '4' => array('', 'dziesięć tysięcy', 'dwadzieścia tysięcy', 'trzydzieści tysięcy', 'czterdzieści tysięcy', 'pięćdziesiąt tysięcy', 'sześćdziesiąt tysięcy', 'siedemdziesiąt tysięcy', 'osiemdziesiąt tysięcy', 'dziewięćdziesiąt tysięcy'),
  33. '5' => array('', 'sto tysięcy', 'dwieście tysięcy', 'trzysta tysięcy', 'czterysta tysięcy', 'pięćset tysięcy', 'sześćset tysięcy', 'siedemset tysięcy', 'osiemset tysięcy', 'dziewięćset tysięcy'),
  34. '6' => array('', 'jeden milion', 'dwa miliony', 'trzy miliony', 'cztery miliony', 'pięć milionów', 'sześć milionów', 'siedem milionów', 'osiem milionów', 'dziewięć milionów')
  35. );
  36.  
  37. $return = array();
  38. $skip_next_level = FALSE;
  39.  
  40. $number = (string)$number;
  41.  
  42. // Pętla przypisująca słowne odpowiedniki cyfrom na określonych miejscach.
  43. for ($i=0, $strlen=strlen($number); $i<$strlen; $i++) {
  44. if ($skip_next_level === TRUE) {
  45. $return[] = '';
  46. $skip_next_level = FALSE;
  47.  
  48. continue;
  49. }
  50.  
  51. $l = $strlen - $i - 1;
  52. $n = (int)$number[$i];
  53.  
  54. if ($n == 1 && isset($levels[($l - 1).'a'])) {
  55. $next_number = (int)$number[$i + 1];
  56.  
  57. if ($next_number != 0) {
  58. $l = ($l - 1).'a';
  59. $n = (int)$number[$i + 1];
  60. }
  61.  
  62. $return[] = $levels[$l][(string)$n];
  63.  
  64. $skip_next_level = TRUE;
  65. }
  66. else {
  67. $return[] = $levels[$l][(string)$n];
  68. }
  69. }
  70. //
  71.  
  72. // Usunięcie powtórzeń typu "sto tysięcy jedenaście tysięcy" do postaci "sto jedenaście tysięcy".
  73. $c = 0;
  74. $remove_after_space = FALSE;
  75.  
  76. for ($i=$strlen-1; $i>=0; $i--) {
  77. $strpos = strpos($return[$i], ' ');
  78.  
  79. if ($strpos > 0) {
  80. if ($remove_after_space === TRUE) {
  81. $return[$i] = substr($return[$i], 0, $strpos);
  82. }
  83. else {
  84. $remove_after_space = TRUE;
  85. }
  86. }
  87.  
  88. if ($c == 2) {
  89. $remove_after_space = FALSE;
  90. $c = 0;
  91. }
  92. else {
  93. $c++;
  94. }
  95. }
  96. //
  97.  
  98. return implode($imploder, $return);
  99. }
  100. }

I przykład działania:
Kod
1 jeden
2 dwa
5 pięć
10 dziesięć
11 jedenaście
17 siedemnaście
20 dwadzieścia
21 dwadzieścia jeden
25 dwadzieścia pięć
100 sto
101 sto jeden
102 sto dwa
110 sto dziesięć
111 sto jedenaście
119 sto dziewiętnaście
123 sto dwadzieścia trzy
170 sto siedemdziesiąt
1000 jeden tysiąc
1001 jeden tysiąc jeden
1010 jeden tysiąc dziesięć
1111 jeden tysiąc sto jedenaście
1125 jeden tysiąc sto dwadzieścia pięć
6666 sześć tysięcy sześćset sześćdziesiąt sześć
10000 dziesięć tysięcy
10001 dziesięć tysięcy jeden
10010 dziesięć tysięcy dziesięć
12345 dwanaście tysięcy trzysta czterdzieści pięć
100000 sto tysięcy
100001 sto tysięcy jeden
100011 sto tysięcy jedenaście
120000 sto dwadzieścia tysięcy
111111 sto jedenaście tysięcy sto jedenaście
7654321 siedem milionów sześćset pięćdziesiąt cztery tysiące trzysta dwadzieścia jeden
9876543 dziewięć milionów osiemset siedemdziesiąt sześć tysięcy pięćset czterdzieści trzy
9000001 dziewięć milionów jeden
9999999 dziewięć milionów dziewięćset dziewięćdziesiąt dziewięć tysięcy dziewięćset dziewięćdziesiąt dziewięć

Go to the top of the page
+Quote Post
phpion
post 23.11.2010, 08:15:20
Post #12





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(pyrrhias @ 23.11.2010, 01:15:53 ) *
Witam,

Bardzo ladny te classa num ale jak znalesc classa num_Core ? Bardzo prosze o pomoc.

Pozdrawiam

Klasa num_Core nie jest Ci potrzebna. Jest to klasa wbudowana we framework Kohana, a metoda num::say() nie korzysta z żadnej metody tej klasy. Możesz więc wywalić extends num_Core.
Go to the top of the page
+Quote Post
pyrrhias
post 20.02.2011, 20:45:20
Post #13





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

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


Bardzo dziekuje za odpowiedzi!
Go to the top of the page
+Quote Post
doggy1988
post 2.02.2012, 19:09:08
Post #14





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

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


moje rozwiązanie wink.gif

aktualna wersja z bloga
  1. <?php
  2.  
  3. /**
  4.  * Number to words converter (polish language)
  5.  *
  6.  * @author programista.it
  7.  * @package Number2Words
  8.  */
  9.  
  10. class Number2WordsPL {
  11.  
  12. /**
  13.   * Converts number to words in polish language
  14.   *
  15.   * @param integer $number The number
  16.   *
  17.   * @return string Words representation
  18.   */
  19. static function convert($number) {
  20. // check if number is negative
  21. $negative = false;
  22. if($number < 0) {
  23. $negative = true;
  24. $number = abs($number); // turn to positive
  25. }
  26. if($number == 0) { // if zero return zero
  27. return 'zero';
  28. }
  29. $i = -1; // our numberMap key
  30. $result = '';
  31. while($number >= 1) {
  32. $token = $number % 1000; // get 3 digits
  33. $number = ($number - $token) / 1000; // cut the number
  34. if($i >= 0) { // if numberMap key is greater than equal thousands
  35. list($first, $second, $third) = self::$numberMap[$i]; // get plural values from numberMap
  36. $pluralize = self::pluralize($token, $first, $second, $third); // pluralize
  37. } else {
  38. $pluralize = '';
  39. }
  40. if($token != 0) { // for zero we don't write anything to output
  41. $hundredsOf = self::hundredsOf($token) . ' '; // convert 3 digit token
  42. $result = $hundredsOf . $pluralize . ' ' . $result ; // add to output string
  43. }
  44. $i++;
  45. }
  46. return trim($negative ? 'minus ' . $result : $result);
  47. }
  48.  
  49. /**
  50.   * Pluralize the word
  51.   *
  52.   * @param integer $number The number with word would be pluralized
  53.   * @param string $first The first variety of the word
  54.   * @param string $second The second variety of the word
  55.   * @param string $third The third variety of the word
  56.   *
  57.   * @return string Pluralized word
  58.   */
  59. static function pluralize($number, $first, $second, $third) {
  60. $number = abs($number); // get absolute value, for negative numbers algoritm is the same
  61. if($number > 20) { // if number is greater than 20
  62. $number %= 10; // get the last digit
  63. if($number == 1) { // for 21, 31, 41, ... result is the same as for 0
  64. $number--;
  65. }
  66. }
  67. if($number == 1) { // 1 - first case
  68. return $first;
  69. } else if($number >= 2 && $number <= 4) { // 2,3,4 - second case
  70. return $second;
  71. } else { // 0,6,7,8,9 - third case
  72. return $third;
  73. }
  74. }
  75.  
  76. protected static $numberMap = array(
  77. array('tysiąc', 'tysiące', 'tysięcy'),
  78. array('milion', 'miliony', 'milionów'),
  79. array('miliard', 'miliardy', 'miliardów'),
  80. array('bilion', 'biliony', 'bilionów'),
  81. array('biliard', 'biliardy', 'biliardów'),
  82. array('trylion', 'tryliony', 'trylionów'),
  83. array('tryliard', 'tryliardy', 'tryliardów')
  84. );
  85.  
  86. protected static $ones = array(
  87. 'jeden', 'dwa', 'trzy',
  88. 'cztery', 'pięć', 'sześć',
  89. 'siedem', 'osiem', 'dziewięć'
  90. );
  91.  
  92. protected static $tens = array(
  93. 'dziesięć', 'dwadzieścia', 'trzydzieści',
  94. 'czterdzieści', 'pięćdziesiąt', 'sześćdziesiąt',
  95. 'siedemdziesiąt', 'osiemdziesiąt', 'dziewięćdziesiąt'
  96. );
  97.  
  98. protected static $specialTens = array(
  99. 'jedenaście', 'dwanaście', 'trzynaście',
  100. 'czternaście', 'piętnaście', 'szesnaście',
  101. 'siedemnaście', 'osiemnaście', 'dziewiętnaście'
  102. );
  103.  
  104. protected static $hundreds = array(
  105. 'sto', 'dwieście', 'trzysta',
  106. 'czterysta', 'pięćset', 'sześćset',
  107. 'siedemset', 'osiemset', 'dziewięćset'
  108. );
  109.  
  110. protected static function hundredsOf($number) {
  111. $ones = $number % 10;
  112. $tens = (($number % 100) - $ones);
  113. $hundreds = ($number - $tens - $ones) / 100;
  114. $tens /= 10;
  115.  
  116. $result = '';
  117. if($hundreds != 0) {
  118. $result .= self::$hundreds[$hundreds - 1] . ' ';
  119. }
  120. if($tens == 1 && $ones != 0) {
  121. $result .= self::$specialTens[$ones - 1] . ' ';
  122. } else {
  123. if($tens != 0) {
  124. $result .= self::$tens[$tens - 1] . ' ';
  125. }
  126. if($ones != 0) {
  127. $result .= self::$ones[$ones - 1] . ' ';
  128. }
  129. }
  130.  
  131. return trim($result);
  132. }
  133. }


  1. <?php echo Number2WordsPL::convert(1029007438124892645);


a jak chcecie do faktur, to ma też pluralize, np.
  1. <?php Number2WordsPL::pluralize(13, 'grosz', 'grosze', 'groszy');


Ten post edytował doggy1988 2.02.2012, 19:13:36
Go to the top of the page
+Quote Post
iwi1
post 2.03.2012, 09:52:07
Post #15





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 27.11.2007

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


Witajcie.
echo Number2WordsPL::convert(520,50);[/php]
daje wynik bez groszy.
Ma ktoś pomysł, jak zrobić, żeby było z groszami

Zrobiłem to w ten sposób, ale czy to jest ładne rozwiązanie
  1.  
  2. $grosze = ($do_zaplaty - (int) $do_zaplaty)*100;
  3. echo number_format($do_zaplaty, 2, ',', ' ') . " zł";
  4. echo "Słownie : ";
  5. echo Number2WordsPL::convert($do_zaplaty);
  6. echo " zł ";
  7. echo (int) $grosze;
  8. echo " ";
  9. echo Number2WordsPL::pluralize($grosze, 'grosz', 'grosze', 'groszy');


Ten post edytował iwi1 2.03.2012, 10:10:19
Go to the top of the page
+Quote Post
thek
post 2.03.2012, 11:57:18
Post #16





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Wszyscy kombinują z groszami jak koń pod górkę, a można przecież podzielić po przecinku string na 2 części, drugą część wziąć, przesunąć przecinek za 2 cyfrę, zaokrąglić i na obu użyć skryptu zamiany na liczby.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
phpion
post 18.04.2012, 07:07:15
Post #17





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(thek @ 2.03.2012, 12:57:18 ) *
Wszyscy kombinują z groszami jak koń pod górkę

Oj przepraszam smile.gif funkcja podana przeze mnie operuje na liczbach całkowitych. To, czy grosze również będą wyświetlone słownie czy w postaci liczby zależy zatem od osoby korzystającej z metody.
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: 28.05.2025 - 05:07