Skip to content

Commit

Permalink
Fix the billion strings for short scale
Browse files Browse the repository at this point in the history
Used the long scale name instead of the short one. Simplified the scale and the ones geneder definition.
  • Loading branch information
fatkaratekid committed Oct 8, 2018
1 parent 1d1ff10 commit 6601e0b
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 70 deletions.
72 changes: 31 additions & 41 deletions num2words/lang_SR.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,28 +23,17 @@

ZERO = ('nula',)

ONES_FEMININE = {
1: ('jedna',),
2: ('dve',),
3: ('tri',),
4: ('četiri',),
5: ('pet',),
6: ('šest',),
7: ('sedam',),
8: ('osam',),
9: ('devet',),
}

ONES = {
1: ('jedan',),
2: ('dva',),
3: ('tri',),
4: ('četiri',),
5: ('pet',),
6: ('šest',),
7: ('sedam',),
8: ('osam',),
9: ('devet',),
1: ('jedan', 'jedna'),
2: ('dva', 'dve'),
3: ('tri', 'tri'),
4: ('četiri', 'četiri'),
5: ('pet', 'pet'),
6: ('šest', 'šest'),
7: ('sedam', 'sedam'),
8: ('osam', 'osam'),
9: ('devet', 'devet'),
}

TENS = {
Expand Down Expand Up @@ -82,31 +71,35 @@
8: ('osamsto',),
9: ('devetsto',),
}
#TODO rename to scale

SCALE = {
1: ('hiljada', 'hiljade', 'hiljada'), # 10^3
2: ('milion', 'miliona', 'miliona'), # 10^6
3: ('milijarda', 'milijarde', 'milijardi'), # 10^9
4: ('trilion', 'triliona', 'triliona'), # 10^12
5: ('kvadrilion', 'kvadriliona', 'kvadriliona'), # 10^15
6: ('kvintiliona', 'kvintiliona', 'kvintiliona'), # 10^18
7: ('sekstilion', 'sekstiliona', 'sekstiliona'), # 10^21
8: ('septilion', 'septiliona', 'septiliona'), # 10^24
9: ('oktilion', 'oktiliona', 'oktiliona'), # 10^27
10: ('nonilion', 'noniliona', 'noniliona'), # 10^30
0: ('', '', '', False),
1: ('hiljada', 'hiljade', 'hiljada', True), # 10^3
2: ('milion', 'miliona', 'miliona', False), # 10^6
3: ('bilion', 'biliona', 'biliona', False), # 10^9
4: ('trilion', 'triliona', 'triliona', False), # 10^12
5: ('kvadrilion', 'kvadriliona', 'kvadriliona', False), # 10^15
6: ('kvintilion', 'kvintiliona', 'kvintiliona', False), # 10^18
7: ('sekstilion', 'sekstiliona', 'sekstiliona', False), # 10^21
8: ('septilion', 'septiliona', 'septiliona', False), # 10^24
9: ('oktilion', 'oktiliona', 'oktiliona', False), # 10^27
10: ('nonilion', 'noniliona', 'noniliona', False), # 10^30
}


class Num2Word_SR(Num2Word_Base):
CURRENCY_FORMS = {
'RUB': (
('rublja', 'rublje', 'rublji', True), ('kopejka', 'kopejke', 'kopejki', True)
('rublja', 'rublje', 'rublji', True),
('kopejka', 'kopejke', 'kopejki', True)
),
'EUR': (
('evro', 'evra', 'evra', False), ('cent', 'centa', 'centi', False)
('evro', 'evra', 'evra', False),
('cent', 'centa', 'centi', False)
),
'RSD': (
('dinar', 'dinara', 'dinara', False), ('para', 'pare', 'para', True)
('dinar', 'dinara', 'dinara', False),
('para', 'pare', 'para', True)
),
}

Expand Down Expand Up @@ -170,14 +163,11 @@ def _int2word(self, number, feminine=False):
if digit_mid == 1:
words.append(TENS[digit_right][0])
elif digit_right > 0:
is_feminine = (
chunk_len == 1 or
(chunk_len == 3 and chunk != 0) or
feminine
and chunk_len == 0
is_feminine = feminine or SCALE[chunk_len][-1]
gender_idx = int(is_feminine)
words.append(
ONES[digit_right][gender_idx]
)
ones = ONES_FEMININE if is_feminine else ONES
words.append(ones[digit_right][0])

if chunk_len > 0 and chunk != 0:
words.append(self.pluralize(chunk, SCALE[chunk_len]))
Expand Down
90 changes: 61 additions & 29 deletions tests/test_sr.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,36 @@
class Num2WordsSRTest(TestCase):

def test_cardinal(self):
self.assertEqual(num2words(100, lang='sr'), "sto")
self.assertEqual(num2words(101, lang='sr'), "sto jedan")
self.assertEqual(num2words(110, lang='sr'), "sto deset")
self.assertEqual(num2words(115, lang='sr'), "sto petnaest")
self.assertEqual(num2words(123, lang='sr'), "sto dvadeset tri")
self.assertEqual(num2words(1000, lang='sr'), "jedna hiljada")
self.assertEqual(num2words(1001, lang='sr'), "jedna hiljada jedan")
self.assertEqual(num2words(2012, lang='sr'), "dve hiljade dvanaest")
self.assertEqual(
num2words(12519.85, lang='sr'),
"dvanaest hiljada petsto devetnaest zapeta osamdeset pet")
self.assertEqual(
num2words(1234567890, lang='sr'),
"jedna milijarda dvesta trideset četiri miliona petsto šezdeset "
"sedam hiljada osamsto devedeset")
self.assertEqual("sto", num2words(100, lang='sr'))
self.assertEqual("sto jedan", num2words(101, lang='sr'))
self.assertEqual("sto deset", num2words(110, lang='sr'))
self.assertEqual("sto petnaest", num2words(115, lang='sr'))
self.assertEqual(
"sto dvadeset tri", num2words(123, lang='sr')
)
self.assertEqual(
"jedna hiljada", num2words(1000, lang='sr')
)
self.assertEqual(
"jedna hiljada jedan", num2words(1001, lang='sr')
)
self.assertEqual(
"dve hiljade dvanaest", num2words(2012, lang='sr')
)
self.assertEqual(
"dvanaest hiljada petsto devetnaest zapeta osamdeset pet",
num2words(12519.85, lang='sr')
)
self.assertEqual(
"jedan bilion dvesta trideset četiri miliona petsto "
"šezdeset sedam hiljada osamsto devedeset",
num2words(1234567890, lang='sr')
)
self.assertEqual(
"dvesta petnaest noniliona četristo šezdeset jedan "
"oktilion četristo sedam septiliona osamsto devedeset "
"dva sekstiliona trideset devet kvintiliona dva kvadriliona "
"sto pedeset sedam triliona sto osamdeset devet milijardi "
"sto pedeset sedam triliona sto osamdeset devet biliona "
"osamsto osamdeset tri miliona devetsto jedna hiljada "
"šesto sedamdeset šest",
num2words(215461407892039002157189883901676, lang='sr')
Expand All @@ -52,7 +62,7 @@ def test_cardinal(self):
"dvesta trideset četiri septiliona šesto devedeset tri "
"sekstiliona šesto šezdeset tri kvintiliona trideset "
"četiri kvadriliona osamsto dvadeset dva triliona osamsto "
"dvadeset četiri milijarde trista osamdeset četiri miliona "
"dvadeset četiri biliona trista osamdeset četiri miliona "
"dvesta dvadeset hiljada dvesta devedeset jedan",
num2words(719094234693663034822824384220291, lang='sr')
)
Expand All @@ -68,11 +78,12 @@ def test_cardinal(self):
num2words(418531, lang='sr'),
)
self.assertEqual(
num2words(1000139, lang='sr'), "jedan milion sto trideset devet"
"jedan milion sto trideset devet",
num2words(1000139, lang='sr')
)

def test_floating_point(self):
self.assertEqual(num2words(5.2, lang='sr'), "pet zapeta dva")
self.assertEqual("pet zapeta dva", num2words(5.2, lang='sr'))
self.assertEqual(
"petsto šezdeset jedan zapeta četrdeset dva",
num2words(561.42, lang='sr')
Expand Down Expand Up @@ -170,22 +181,38 @@ def test_to_currency(self):

)
self.assertEqual(
'jedna hiljada dvesta trideset četiri evra, pedeset šest centi',
num2words(1234.56, lang='sr', to='currency', currency='EUR')
'jedna hiljada dvesta trideset četiri evra, '
'pedeset šest centi',
num2words(
1234.56, lang='sr', to='currency', currency='EUR'
)
)
self.assertEqual(
'jedna hiljada dvesta trideset četiri rublje, pedeset šest kopejki',
num2words(1234.56, lang='sr', to='currency', currency='RUB')
'jedna hiljada dvesta trideset četiri rublje, '
'pedeset šest kopejki',
num2words(
1234.56, lang='sr', to='currency', currency='RUB'
)
)
self.assertEqual(
'sto jedan evro i jedanaest centi',
num2words(10111, lang='sr', to='currency', currency='EUR',
seperator=' i'),
num2words(
10111,
lang='sr',
to='currency',
currency='EUR',
seperator=' i'
)
)
self.assertEqual(
'sto jedna rublja i dvadeset jedna kopejka',
num2words(10121, lang='sr', to='currency', currency='RUB',
seperator=' i'),
num2words(
10121,
lang='sr',
to='currency',
currency='RUB',
seperator=' i'
)
)
self.assertEqual(
'sto jedna rublja i dvadeset dve kopejke',
Expand All @@ -199,8 +226,13 @@ def test_to_currency(self):
)
self.assertEqual(
'minus dvanaest hiljada petsto devetnaest evra, 85 centi',
num2words(-1251985, lang='sr', to='currency', currency='EUR',
cents=False),
num2words(
-1251985,
lang='sr',
to='currency',
currency='EUR',
cents=False
)
)
self.assertEqual(
"trideset osam evra i 40 centi",
Expand Down

0 comments on commit 6601e0b

Please sign in to comment.