Skip to content

Commit 45a8d50

Browse files
committed
add big numbers until Quintinillion
add a test function for a big numbers
1 parent 8002ed4 commit 45a8d50

File tree

2 files changed

+42
-12
lines changed

2 files changed

+42
-12
lines changed

num2words/lang_AR.py

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
class Num2Word_AR(Num2Word_Base):
4444
errmsg_toobig = "abs(%s) must be less than %s."
45-
MAXVAL = 1000000000000000050331649 # 10 **36
45+
MAXVAL = 9999999999999999999999999999999999999999999999999 # 1000000000000000050331649 # 10 **36
4646

4747
def __init__(self):
4848
super().__init__()
@@ -79,26 +79,37 @@ def __init__(self):
7979
self.arabicHundreds = [
8080
"", "مائة", "مئتان", "ثلاثمائة", "أربعمائة", "خمسمائة", "ستمائة",
8181
"سبعمائة", "ثمانمائة", "تسعمائة"
82-
]
82+
] # should be : ["تسعة مائة","ثمانية مائة","سبعة مائة","ستة مائة","خمسة مائة","أربعة مائة","ثلاثة مائة","مئتان","مائة"]
83+
8384
self.arabicAppendedTwos = [
8485
"مئتا", "ألفا", "مليونا", "مليارا", "تريليونا", "كوادريليونا",
85-
"كوينتليونا", "سكستيليونا"
86+
"كوينتليونا", "سكستيليونا","سبتيليونا","أوكتيليونا ","نونيليونا",
87+
"ديسيليونا","أندسيليونا","دوديسيليونا","تريديسيليونا","كوادريسيليونا",
88+
"كوينتينيليونا"
8689
]
8790
self.arabicTwos = [
8891
"مئتان", "ألفان", "مليونان", "ملياران", "تريليونان",
89-
"كوادريليونان", "كوينتليونان", "سكستيليونان"
92+
"كوادريليونان", "كوينتليونان", "سكستيليونان","سبتيليونان",
93+
"أوكتيليونان ","نونيليونان ","ديسيليونان","أندسيليونان",
94+
"دوديسيليونان","تريديسيليونان","كوادريسيليونان","كوينتينيليونان"
9095
]
9196
self.arabicGroup = [
9297
"مائة", "ألف", "مليون", "مليار", "تريليون", "كوادريليون",
93-
"كوينتليون", "سكستيليون"
98+
"كوينتليون", "سكستيليون","سبتيليون","أوكتيليون","نونيليون",
99+
"ديسيليون","أندسيليون","دوديسيليون","تريديسيليون","كوادريسيليون",
100+
"كوينتينيليون"
94101
]
95102
self.arabicAppendedGroup = [
96103
"", "ألفاً", "مليوناً", "ملياراً", "تريليوناً", "كوادريليوناً",
97-
"كوينتليوناً", "سكستيليوناً"
104+
"كوينتليوناً", "سكستيليوناً","سبتيليوناً","أوكتيليوناً","نونيليوناً",
105+
"ديسيليوناً","أندسيليوناً","دوديسيليوناً","تريديسيليوناً","كوادريسيليوناً",
106+
"كوينتينيليوناً"
98107
]
99108
self.arabicPluralGroups = [
100109
"", "آلاف", "ملايين", "مليارات", "تريليونات", "كوادريليونات",
101-
"كوينتليونات", "سكستيليونات"
110+
"كوينتليونات", "سكستيليونات","سبتيليونات","أوكتيليونات","نونيليونات",
111+
"ديسيليونات","أندسيليونات","دوديسيليونات","تريديسيليونات","كوادريسيليونات",
112+
"كوينتينيليونات"
102113
]
103114
assert len(self.arabicAppendedGroup) == len(self.arabicGroup)
104115
assert len(self.arabicPluralGroups) == len(self.arabicGroup)
@@ -209,8 +220,16 @@ def process_arabic_group(self, group_number, group_level,
209220

210221
return ret_val
211222

223+
def abs(self, number):
224+
return number if number >= 0 else -number
225+
226+
def to_str(self, number):
227+
integer = int(number)
228+
decimal = round((number - integer) * 10**9)
229+
return str(integer) + "." + "{:09d}".format(decimal)
230+
212231
def convert(self, value):
213-
self.number = "{:.9f}".format(value)
232+
self.number = self.to_str(value)
214233
self.number_to_arabic(self.arabicPrefixText, self.arabicSuffixText)
215234
return self.convert_to_arabic()
216235

@@ -346,7 +365,7 @@ def to_ordinal(self, number, prefix=''):
346365
self.currency_unit = ('', '', '', '')
347366
self.arabicPrefixText = prefix
348367
self.arabicSuffixText = ""
349-
return "{}".format(self.convert(abs(number)).strip())
368+
return "{}".format(self.convert(self.abs(number)).strip())
350369

351370
def to_year(self, value):
352371
value = self.validate_number(value)
@@ -367,4 +386,4 @@ def to_cardinal(self, number):
367386
self.arabicPrefixText = ""
368387
self.arabicSuffixText = ""
369388
self.arabicOnes = ARABIC_ONES
370-
return minus + self.convert(value=abs(number)).strip()
389+
return minus + self.convert(value=self.abs(number)).strip()

tests/test_ar.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,20 @@ def test_year(self):
132132

133133
def test_max_numbers(self):
134134

135-
for number in 10 ** 36, 123456789123456789123456789, 123456789123456789123456789123456789:
136-
135+
for number in 9999999999999999999999999999999999999999999999999, 10000000000000000000000000000000000000000000000000:
136+
137137
with self.assertRaises(OverflowError) as context:
138138
num2words(number, lang='ar')
139139

140140
self.assertTrue('must be less' in str(context.exception))
141+
142+
def test_big_numbers(self):
143+
self.assertEqual(num2words(1000000045000000000000003000000002000000300, to='cardinal', lang='ar'),
144+
'واحد تريديسيليون و خمسة و أربعون ديسيليوناً و ثلاثة كوينتليونات و ملياران و ثلاثمائة'
145+
)
146+
self.assertEqual(num2words(-1000000000000000000000003000000002000000302, to='cardinal', lang='ar'),
147+
'سالب واحد تريديسيليون و ثلاثة كوينتليونات و ملياران و ثلاثمائة و اثنان'
148+
)
149+
self.assertEqual(num2words(9999999999999999999999999999999999999999999999992, to='cardinal', lang='ar'),
150+
'تسعة كوينتينيليونات و تسعمائةتسعة و تسعون كوادريسيليوناً و تسعمائةتسعة و تسعون تريديسيليوناً و تسعمائةتسعة و تسعون دوديسيليوناً و تسعمائةتسعة و تسعون أندسيليوناً و تسعمائةتسعة و تسعون ديسيليوناً و تسعمائةتسعة و تسعون نونيليوناً و تسعمائةتسعة و تسعون أوكتيليوناً و تسعمائةتسعة و تسعون سبتيليوناً و تسعمائةتسعة و تسعون سكستيليوناً و تسعمائةتسعة و تسعون كوينتليوناً و تسعمائةتسعة و تسعون كوادريليوناً و تسعمائةتسعة و تسعون تريليوناً و تسعمائةتسعة و تسعون ملياراً و تسعمائةتسعة و تسعون مليوناً و تسعمائةتسعة و تسعون ألفاً و تسعمائةاثنان و تسعون'
151+
)

0 commit comments

Comments
 (0)