Posted By

komor on 11/02/06


Tagged

rails ruby Polishspecific


Versions (?)

POLISH: liczby (Fixnum, Bignum) zapisz słownie (jako String)


 / Published in: Ruby
 

URL: http://homepage.mac.com/komor/iblog/B1412381085/C1090518654/E20061103010410/index.html

This snippet is Polish-language specific. This class expands a number (Fixnum or Bignum) into a string with a textual representation of that number in Polish language. Currency suffix supported. Example: 456 -> "four hundred fifty six" (but in Polish!)

  1. # ----------------------------------------
  2. # Napisz słownie liczbę
  3. # Wersja 1, 21/03/2006
  4. #
  5. # Autor: Rafał Komorowski
  6. # Licencja: public domain
  7. # ----------------------------------------
  8. #
  9. # ENGLISH DESCRIPTION:
  10. # This class expands a number (Fixnum or Bignum) into a string with a textual representation of that number in Polish language.
  11. # Example: 456 -> "four hundred fifty six" (but in Polish)
  12. # Current limitations: no Floats allowed.
  13. # Configuration possibilities: extend currencies list (Waluta hash).
  14. # To do: Floats (cents, eurocents, etc., or just a fraction). Named attributes (as seen in Rails and such).
  15. #
  16. # POLSKI OPIS:
  17. # Ta klasa zamienia liczbę (Fixnum lub Bignum) na string z tekstową reprezentacją tej liczby w języku polskim.
  18. # Przykład: 456 -> "czterysta pięćdziesiąt sześć"
  19. # Aktualne ograniczenia: nie przyjmuje Floatów.
  20. # Możliwości konfigurowania: można dodać nowe waluty (hash Waluta).
  21. #
  22.  
  23.  
  24. class Slownie
  25.  
  26. # Liczba - hash przechowujący słowny zapis liczb z uwzględnieniem przypadków, gdzie potrzeba (tysiące, miliony, ...)
  27. Liczba = {
  28. 0 => '',
  29. 1 => 'jeden',
  30. 2 => 'dwa',
  31. 3 => 'trzy',
  32. 4 => 'cztery',
  33. 5 => 'pięć',
  34. 6 => 'sześć',
  35. 7 => 'siedem',
  36. 8 => 'osiem',
  37. 9 => 'dziewięć',
  38. 10 => 'dziesięć',
  39. 11 => 'jedenaście',
  40. 12 => 'dwanaście',
  41. 13 => 'trzynaście',
  42. 14 => 'czternaście',
  43. 15 => 'piętnaście',
  44. 16 => 'szesnaście',
  45. 17 => 'siedemnaście',
  46. 18 => 'osiemnaście',
  47. 19 => 'dziewiętnaście',
  48. 20 => 'dwadzieścia',
  49. 30 => 'trzydzieści',
  50. 40 => 'czterdzieści',
  51. 50 => 'pięćdziesiąt',
  52. 60 => 'sześćdziesiąt',
  53. 70 => 'siedemdziesiąt',
  54. 80 => 'osiemdziesiąt',
  55. 90 => 'dziewięćdziesiąt',
  56. 100 => 'sto',
  57. 200 => 'dwieście',
  58. 300 => 'trzysta',
  59. 400 => 'czterysta',
  60. 500 => 'pięćset',
  61. 600 => 'sześćset',
  62. 700 => 'siedemset',
  63. 800 => 'osiemset',
  64. 900 => 'dziewięćset',
  65. # tu lecą jednostki odmieniane przez przypadki
  66. 1000 => { 1 => 'tysiąc', 2 => 'tysiące', 5 => 'tysięcy' },
  67. 1000000 => { 1 => 'milion', 2 => 'miliony', 5 => 'milionów' },
  68. 1000000000 => { 1 => 'miliard', 2 => 'miliardy', 5 => 'miliardów' }.freeze
  69. }
  70.  
  71. # Waluta - hash przechowujący waluty - ich odmianę przez przypadki
  72. Waluta = {
  73. 'PLN' => { 1 => 'złoty', 2 => 'złote', 5 => 'złotych' },
  74. 'USD' => { 1 => 'dolar', 2 => 'dolary', 5 => 'dolarów' },
  75. 'EUR' => { 1 => 'euro', 2 => 'euro', 5 => 'euro' }
  76. }
  77.  
  78. # Główna metoda - ją wywołujemy, jako class-method
  79. def Slownie.slownie(liczba, separator =' ', waluta = 'PLN')
  80. raise "SLOWNIE: Nie obsługujemy jeszcze Floatów, niestety!" if liczba.class == Float
  81. return ('zero ' + Slownie.przypadek(0, Liczba[waluta])) if liczba == 0
  82. @sep = separator
  83. res = ''
  84. if liczba > 999999999 # miliardy
  85. mlds = liczba / 1000000000 % 1000
  86. res << Slownie.set(mlds) + Slownie.dziesiat(mlds) + Slownie.przypadek(mlds, Liczba[1000000000]) + @sep
  87. end
  88. if liczba > 999999 # miliony
  89. mlns = liczba / 1000000 % 1000
  90. if mlns != 0
  91. res << Slownie.set(mlns) + Slownie.dziesiat(mlns % 100) + Slownie.przypadek(mlns, Liczba[1000000]) + @sep
  92. end
  93. end
  94. if liczba > 999 # tysiące
  95. tys = liczba / 1000 % 1000
  96. if tys != 0
  97. res << Slownie.set(tys) + Slownie.dziesiat(tys % 100) + Slownie.przypadek(tys, Liczba[1000]) + @sep
  98. end
  99. end
  100. jedn = liczba % 1000
  101. res << Slownie.set(jedn % 1000) + Slownie.dziesiat(jedn % 100)
  102. if waluta != ''
  103. res << Slownie.przypadek(liczba, Waluta[waluta]) + @sep
  104. end
  105. res.chomp!(@sep)
  106. return res
  107. end
  108.  
  109. protected
  110. def Slownie.set(liczba)
  111. if liczba > 99
  112. return Liczba[liczba - (liczba % 100)] + @sep
  113. else
  114. return ''
  115. end
  116. end
  117.  
  118. def Slownie.dziesiat(liczba)
  119. liczba = liczba % 100
  120. if liczba == 0
  121. return ''
  122. elsif liczba < 20
  123. return Liczba[liczba] + @sep
  124. elsif (liczba % 10) != 0
  125. return Liczba[liczba - liczba % 10] + @sep + Liczba[liczba % 10] + @sep
  126. else
  127. return Liczba[liczba - liczba % 10] + @sep
  128. end
  129. end
  130.  
  131. def Slownie.przypadek(liczba, czego)
  132. liczba = liczba % 100
  133. flag21 = false
  134. if (liczba % 100) > 21
  135. liczba = (liczba % 10)
  136. flag21 = true
  137. end
  138. if liczba == 0 then czego[5]
  139. elsif liczba == 1 then flag21 ? czego[5] : czego[1]
  140. elsif (liczba >= 2 and liczba <= 4) then czego[2]
  141. elsif liczba >= 5 then czego[5]
  142. end
  143. end
  144.  
  145. end
  146.  
  147.  
  148. # Examples of use / Przykłady użycia:
  149.  
  150. r = 3794
  151. puts "(#{r}) \'#{Slownie.slownie(r)}\'\n\n"
  152.  
  153. (20..32).each do |r|
  154. puts "(#{r}) \'#{Slownie.slownie(r, ' ', 'USD')}\'\n"
  155. end
  156. puts "\n"
  157.  
  158. 10.times {
  159. r=rand(9999)
  160. puts "(#{sprintf("%04d", r)}) \'" + Slownie.slownie(r, '*', 'EUR') + "\'\n"
  161. }

Report this snippet  

You need to login to post a comment.