Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [gotowa funkcja] Liczba słownie
Forum PHP.pl > Forum > Gotowe rozwiązania
BzikOS
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.
spenalzo
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 :-)
BzikOS
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. ?>
spenalzo
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
xmarko
a jak bedzie wyglądał zapis skryptu do pokazania kwoty w zapisie
np 12,50 :
a to wynik:
dwanascie złotych 50/100
?
BzikOS
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..
kszychu
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ą...
phpion
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ęć
Wicepsik
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ęć
sarin28
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
pyrrhias
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ęć

phpion
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.
pyrrhias
Bardzo dziekuje za odpowiedzi!
doggy1988
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');
iwi1
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');
thek
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.
phpion
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.
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.