Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [gotowa funkcja] Liczba słownie
BzikOS
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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
 
Start new topic
Odpowiedzi
pyrrhias
post
Post #2





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 (IMG:style_emoticons/default/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
Post #3





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

Posty w temacie


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

 



RSS Aktualny czas: 8.10.2025 - 01:49