Skip to content

Instantly share code, notes, and snippets.

@k3rni
Created February 22, 2010 14:49
Show Gist options
  • Save k3rni/311121 to your computer and use it in GitHub Desktop.
Save k3rni/311121 to your computer and use it in GitHub Desktop.
# Original author: Rafał Komorowski, 2006. Found at http://homepage.mac.com/komor/iblog/B1412381085/C1090518654/E20061103010410/index.html
# Licensed as Public Domain code
# * fixed handling of zero (was completely broken in the original)
# * added fraction support ('grosze'), by using the amount multiplied by 100. See method #zlgr
class Slownie
# Liczba - hash przechowujący słowny zapis liczb z uwzględnieniem przypadków, gdzie potrzeba (tysiące, miliony, ...)
Liczba = {
0 => '',
1 => 'jeden',
2 => 'dwa',
3 => 'trzy',
4 => 'cztery',
5 => 'pięć',
6 => 'sześć',
7 => 'siedem',
8 => 'osiem',
9 => 'dziewięć',
10 => 'dziesięć',
11 => 'jedenaście',
12 => 'dwanaście',
13 => 'trzynaście',
14 => 'czternaście',
15 => 'piętnaście',
16 => 'szesnaście',
17 => 'siedemnaście',
18 => 'osiemnaście',
19 => 'dziewiętnaście',
20 => 'dwadzieścia',
30 => 'trzydzieści',
40 => 'czterdzieści',
50 => 'pięćdziesiąt',
60 => 'sześćdziesiąt',
70 => 'siedemdziesiąt',
80 => 'osiemdziesiąt',
90 => 'dziewięćdziesiąt',
100 => 'sto',
200 => 'dwieście',
300 => 'trzysta',
400 => 'czterysta',
500 => 'pięćset',
600 => 'sześćset',
700 => 'siedemset',
800 => 'osiemset',
900 => 'dziewięćset',
# tu lecą jednostki odmieniane przez przypadki
1000 => { 1 => 'tysiąc', 2 => 'tysiące', 5 => 'tysięcy' },
1000000 => { 1 => 'milion', 2 => 'miliony', 5 => 'milionów' },
1000000000 => { 1 => 'miliard', 2 => 'miliardy', 5 => 'miliardów' }.freeze
}
# Waluta - hash przechowujący waluty - ich odmianę przez przypadki
Waluta = {
'PLN' => { 1 => 'złoty', 2 => 'złote', 5 => 'złotych' },
'USD' => { 1 => 'dolar', 2 => 'dolary', 5 => 'dolarów' },
'EUR' => { 1 => 'euro', 2 => 'euro', 5 => 'euro' },
'_gr' => { 1 => 'grosz', 2 => 'grosze', 5 => 'groszy' }
}
# Główna metoda - ją wywołujemy, jako class-method
def Slownie.slownie(liczba, separator =' ', waluta = 'PLN')
raise "SLOWNIE: Nie obsługujemy jeszcze Floatów, niestety!" if liczba.class == Float
return ('zero ' + Slownie.przypadek(0, Waluta[waluta])) if liczba == 0
@sep = separator
res = ''
if liczba > 999999999 # miliardy
mlds = liczba / 1000000000 % 1000
res << Slownie.set(mlds) + Slownie.dziesiat(mlds) + Slownie.przypadek(mlds, Liczba[1000000000]) + @sep
end
if liczba > 999999 # miliony
mlns = liczba / 1000000 % 1000
if mlns != 0
res << Slownie.set(mlns) + Slownie.dziesiat(mlns % 100) + Slownie.przypadek(mlns, Liczba[1000000]) + @sep
end
end
if liczba > 999 # tysiące
tys = liczba / 1000 % 1000
if tys != 0
res << Slownie.set(tys) + Slownie.dziesiat(tys % 100) + Slownie.przypadek(tys, Liczba[1000]) + @sep
end
end
jedn = liczba % 1000
res << Slownie.set(jedn % 1000) + Slownie.dziesiat(jedn % 100)
if waluta != ''
res << Slownie.przypadek(liczba, Waluta[waluta]) + @sep
end
res.chomp!(@sep)
return res
end
def Slownie.zlgr(liczba)
zl, gr = liczba.divmod 100
slownie(zl) + ' ' + slownie(gr, ' ', '_gr')
end
protected
def Slownie.set(liczba)
if liczba > 99
return Liczba[liczba - (liczba % 100)] + @sep
else
return ''
end
end
def Slownie.dziesiat(liczba)
liczba = liczba % 100
if liczba == 0
return ''
elsif liczba < 20
return Liczba[liczba] + @sep
elsif (liczba % 10) != 0
return Liczba[liczba - liczba % 10] + @sep + Liczba[liczba % 10] + @sep
else
return Liczba[liczba - liczba % 10] + @sep
end
end
def Slownie.przypadek(liczba, czego)
liczba = liczba % 100
flag21 = false
if (liczba % 100) > 21
liczba = (liczba % 10)
flag21 = true
end
if liczba == 0 then czego[5]
elsif liczba == 1 then flag21 ? czego[5] : czego[1]
elsif (liczba >= 2 and liczba <= 4) then czego[2]
elsif liczba >= 5 then czego[5]
end
end
end
# Examples of use / Przykłady użycia:
r = 3794
puts "(#{r}) \'#{Slownie.slownie(r)}\'\n\n"
(20..32).each do |r|
puts "(#{r}) \'#{Slownie.slownie(r, ' ', 'USD')}\'\n"
end
puts "\n"
10.times {
r=rand(9999)
puts "(#{sprintf("%04d", r)}) \'" + Slownie.slownie(r, '*', 'EUR') + "\'\n"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment