diff --git a/MANIFEST.in b/MANIFEST.in index 6cfdbc2..6822064 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,3 @@ include CHANGES.rst include COPYING +include tests/* diff --git a/num2words/__init__.py b/num2words/__init__.py index e6441a2..aecacdb 100644 --- a/num2words/__init__.py +++ b/num2words/__init__.py @@ -72,6 +72,7 @@ CONVERTER_CLASSES = { 'uk': lang_UK.Num2Word_UK() } + CONVERTES_TYPES = ['cardinal', 'ordinal', 'year', 'currency'] diff --git a/num2words/base.py b/num2words/base.py index e1e4383..d242f34 100644 --- a/num2words/base.py +++ b/num2words/base.py @@ -41,29 +41,24 @@ class Num2Word_Base(object): self.MAXVAL = 1000 * self.cards.order[0] - def set_numwords(self): self.set_high_numwords(self.high_numwords) self.set_mid_numwords(self.mid_numwords) self.set_low_numwords(self.low_numwords) - def gen_high_numwords(self, units, tens, lows): out = [u + t for t in tens for u in units] out.reverse() return out + lows - def set_mid_numwords(self, mid): for key, val in mid: self.cards[key] = val - def set_low_numwords(self, numwords): for word, n in zip(numwords, range(len(numwords) - 1, -1, -1)): self.cards[n] = word - def splitnum(self, value): for elem in self.cards: if elem > value: @@ -89,7 +84,6 @@ class Num2Word_Base(object): return out - def to_cardinal(self, value): try: assert int(value) == value @@ -110,21 +104,20 @@ class Num2Word_Base(object): words, num = self.clean(val) return self.title(out + words) - def float2tuple(self, value): pre = int(value) post = abs(value - pre) * 10**self.precision if abs(round(post) - post) < 0.01: - # We generally floor all values beyond our precision (rather than rounding), but in - # cases where we have something like 1.239999999, which is probably due to python's - # handling of floats, we actually want to consider it as 1.24 instead of 1.23 + # We generally floor all values beyond our precision (rather than + # rounding), but in cases where we have something like 1.239999999, + # which is probably due to python's handling of floats, we actually + # want to consider it as 1.24 instead of 1.23 post = int(round(post)) else: post = int(math.floor(post)) return pre, post - def to_cardinal_float(self, value): try: float(value) == value @@ -146,11 +139,9 @@ class Num2Word_Base(object): return " ".join(out) - def merge(self, curr, next): raise NotImplementedError - def clean(self, val): out = val while len(val) != 1: @@ -172,7 +163,6 @@ class Num2Word_Base(object): val = out return out[0] - def title(self, value): if self.is_title: out = [] @@ -185,30 +175,24 @@ class Num2Word_Base(object): value = " ".join(out) return value - def verify_ordinal(self, value): if not value == int(value): raise TypeError(self.errmsg_floatord % value) if not abs(value) == value: raise TypeError(self.errmsg_negord % value) - def verify_num(self, value): return 1 - def set_wordnums(self): pass - def to_ordinal(self, value): return self.to_cardinal(value) - def to_ordinal_num(self, value): return value - # Trivial version def inflect(self, value, text): text = text.split("/") @@ -216,8 +200,7 @@ class Num2Word_Base(object): return text[0] return "".join(text) - - #//CHECK: generalise? Any others like pounds/shillings/pence? + # //CHECK: generalise? Any others like pounds/shillings/pence? def to_splitnum(self, val, hightxt="", lowtxt="", jointxt="", divisor=100, longval=True, cents=True): out = [] @@ -252,23 +235,18 @@ class Num2Word_Base(object): return " ".join(out) - def to_year(self, value, **kwargs): return self.to_cardinal(value) - def to_currency(self, value, **kwargs): return self.to_cardinal(value) - def base_setup(self): pass - def setup(self): pass - def test(self, value): try: _card = self.to_cardinal(value) @@ -285,5 +263,5 @@ class Num2Word_Base(object): except: _ordnum = "invalid" - print ("For %s, card is %s;\n\tord is %s; and\n\tordnum is %s." % - (value, _card, _ord, _ordnum)) + print("For %s, card is %s;\n\tord is %s; and\n\tordnum is %s." + % (value, _card, _ord, _ordnum)) diff --git a/num2words/compat.py b/num2words/compat.py index 7395f4c..26ea36c 100644 --- a/num2words/compat.py +++ b/num2words/compat.py @@ -18,9 +18,9 @@ import sys PY3 = sys.version_info[0] == 3 + def to_s(val): if PY3: return str(val) else: return unicode(val) - diff --git a/num2words/lang_AR.py b/num2words/lang_AR.py index a43c968..913180e 100644 --- a/num2words/lang_AR.py +++ b/num2words/lang_AR.py @@ -18,11 +18,12 @@ from __future__ import division, unicode_literals, print_function from . import lang_EU + class Num2Word_AR(lang_EU.Num2Word_EU): def set_high_numwords(self, high): - max = 3 + 3*len(high) + max = 3 + 3 * len(high) for word, n in zip(high, range(max, 3, -3)): - self.cards[10**n] = word + "illion" + self.cards[10 ** n] = word + "illion" def setup(self): self.negword = "سالب " @@ -30,7 +31,7 @@ class Num2Word_AR(lang_EU.Num2Word_EU): self.errmsg_nornum = "Only numbers may be converted to words." self.exclude_title = ["و", "فاصلة", "سالب"] - self.mid_numwords = [(1000000, "مليون"),(1000, "ألف"), (100, "مئة"), + self.mid_numwords = [(1000000, "مليون"), (1000, "ألف"), (100, "مئة"), (90, "تسعين"), (80, "ثمانين"), (70, "سبعين"), (60, "ستين"), (50, "خمسين"), (40, "أربعين"), (30, "ثلاثين")] @@ -39,35 +40,33 @@ class Num2Word_AR(lang_EU.Num2Word_EU): "اثناعشر", "أحد عشر", "عشرة", "تسعة", "ثمانية", "سبعة", "ستة", "خمسة", "أربعة", "ثلاثة", "اثنين", "واحد", "صفر"] - self.ords = { "واحد" : "أول", - "اثنين" : "ثاني", - "ثلاثة" : "ثالث", - "أربعة": "رابع", - "خمسة" : "خامس", - "ثمانية" : "ثامن", - "تسعة" : "تاسع", - "اثناعشر" : "ثاني عشر" } - + self.ords = {"واحد": "أول", + "اثنين": "ثاني", + "ثلاثة": "ثالث", + "أربعة": "رابع", + "خمسة": "خامس", + "ثمانية": "ثامن", + "تسعة": "تاسع", + "اثناعشر": "ثاني عشر"} def merge(self, lpair, rpair): ltext, lnum = lpair rtext, rnum = rpair if lnum == 1 and rnum < 100: return (rtext, rnum) - elif 100 > lnum > rnum : - return ("%s و%s"%(rtext, ltext), rnum + lnum) + elif 100 > lnum > rnum: + return ("%s و%s" % (rtext, ltext), rnum + lnum) elif lnum >= 100 > rnum: - return ("%s و %s"%(ltext, rtext), lnum + rnum) + return ("%s و %s" % (ltext, rtext), lnum + rnum) elif rnum > lnum: if lnum == 1 and rnum in [100, 1000, 1000000]: - return ("%s"%(rtext), rnum * lnum) + return ("%s" % (rtext), rnum * lnum) if lnum == 2 and rnum == 100: return ("مئتين", rnum * lnum) if lnum == 2 and rnum in [100, 1000]: - return ("%sين"%(rtext), rnum * lnum) - return ("%s %s"%(ltext, rtext), lnum * rnum) - return ("%s، %s"%(ltext, rtext), lnum + rnum) - + return ("%sين" % (rtext), rnum * lnum) + return ("%s %s" % (ltext, rtext), lnum * rnum) + return ("%s، %s" % (ltext, rtext), lnum + rnum) def to_ordinal(self, value): self.verify_ordinal(value) @@ -82,21 +81,19 @@ class Num2Word_AR(lang_EU.Num2Word_EU): outwords[-1] = "،".join(lastwords) return " ".join(outwords) - def to_ordinal_num(self, value): self.verify_ordinal(value) - return "%s%s"%(value, self.to_ordinal(value)[-2:]) - + return "%s%s" % (value, self.to_ordinal(value)[-2:]) def to_year(self, val, longval=True): - if not (val//100)%10: + if not (val // 100) % 10: return self.to_cardinal(val) return self.to_splitnum(val, hightxt="مئة", jointxt="و", longval=longval) def to_currency(self, val, longval=True): return self.to_splitnum(val, hightxt="ريال", lowtxt="هللة", - jointxt="و", longval=longval, cents = True) + jointxt="و", longval=longval, cents=True) n2w = Num2Word_AR() @@ -105,14 +102,15 @@ to_ord = n2w.to_ordinal to_ordnum = n2w.to_ordinal_num to_year = n2w.to_year + def main(): - for val in [ 1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, - -21212121211221211111, -2.121212, -1.0000100]: + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) - for val in [1,120,1000,1120,1800, 1976,2000,2010,2099,2171]: + for val in [1, 120, 1000, 1120, 1800, 1976, 2000, 2010, 2099, 2171]: print(val, "is", n2w.to_currency(val)) print(val, "is", n2w.to_year(val)) diff --git a/num2words/lang_DE.py b/num2words/lang_DE.py index 1c2fa0f..3d99db2 100644 --- a/num2words/lang_DE.py +++ b/num2words/lang_DE.py @@ -18,21 +18,34 @@ from __future__ import unicode_literals, print_function from .lang_EU import Num2Word_EU + class Num2Word_DE(Num2Word_EU): def set_high_numwords(self, high): - max = 3 + 6*len(high) + max = 3 + 6 * len(high) for word, n in zip(high, range(max, 3, -6)): - self.cards[10**n] = word + "illiarde" - self.cards[10**(n-3)] = word + "illion" + self.cards[10 ** n] = word + "illiarde" + self.cards[10 ** (n - 3)] = word + "illion" def setup(self): self.negword = "minus " self.pointword = "Komma" - self.errmsg_floatord = "Die Gleitkommazahl %s kann nicht in eine Ordnungszahl konvertiert werden." # "Cannot treat float %s as ordinal." - self.errmsg_nonnum = "Nur Zahlen (type(%s)) können in Wörter konvertiert werden." # "type(((type(%s)) ) not in [long, int, float]" - self.errmsg_negord = "Die negative Zahl %s kann nicht in eine Ordnungszahl konvertiert werden." # "Cannot treat negative num %s as ordinal." - self.errmsg_toobig = "Die Zahl %s muss kleiner als %s sein." # "abs(%s) must be less than %s." + # "Cannot treat float %s as ordinal." + self.errmsg_floatord = ( + "Die Gleitkommazahl %s kann nicht in eine Ordnungszahl " + + "konvertiert werden." + ) + # "type(((type(%s)) ) not in [long, int, float]" + self.errmsg_nonnum = ( + "Nur Zahlen (type(%s)) können in Wörter konvertiert werden." + ) + # "Cannot treat negative num %s as ordinal." + self.errmsg_negord = ( + "Die negative Zahl %s kann nicht in eine Ordnungszahl " + + "konvertiert werden." + ) + # "abs(%s) must be less than %s." + self.errmsg_toobig = "Die Zahl %s muss kleiner als %s sein." self.exclude_title = [] lows = ["non", "okt", "sept", "sext", "quint", "quadr", "tr", "b", "m"] @@ -40,16 +53,18 @@ class Num2Word_DE(Num2Word_EU): "okto", "novem"] tens = ["dez", "vigint", "trigint", "quadragint", "quinquagint", "sexagint", "septuagint", "oktogint", "nonagint"] - self.high_numwords = ["zent"]+self.gen_high_numwords(units, tens, lows) + self.high_numwords = ( + ["zent"] + self.gen_high_numwords(units, tens, lows) + ) self.mid_numwords = [(1000, "tausend"), (100, "hundert"), (90, "neunzig"), (80, "achtzig"), (70, "siebzig"), - (60, "sechzig"), (50, "f\xFCnfzig"), (40, "vierzig"), - (30, "drei\xDFig")] + (60, "sechzig"), (50, "f\xFCnfzig"), + (40, "vierzig"), (30, "drei\xDFig")] self.low_numwords = ["zwanzig", "neunzehn", "achtzehn", "siebzehn", "sechzehn", "f\xFCnfzehn", "vierzehn", "dreizehn", - "zw\xF6lf", "elf", "zehn", "neun", "acht", "sieben", - "sechs", "f\xFCnf", "vier", "drei", "zwei", "eins", - "null"] + "zw\xF6lf", "elf", "zehn", "neun", "acht", + "sieben", "sechs", "f\xFCnf", "vier", "drei", + "zwei", "eins", "null"] self.ords = {"eins": "ers", "drei": "drit", "acht": "ach", @@ -66,12 +81,12 @@ class Num2Word_DE(Num2Word_EU): ctext, cnum, ntext, nnum = curr + next if cnum == 1: - if nnum < 10**6: + if nnum < 10 ** 6: return next ctext = "eine" if nnum > cnum: - if nnum >= 10**6: + if nnum >= 10 ** 6: if cnum > 1: if ntext.endswith("e"): ntext += "n" @@ -84,7 +99,7 @@ class Num2Word_DE(Num2Word_EU): if nnum == 1: ntext = "ein" ntext, ctext = ctext, ntext + "und" - elif cnum >= 10**6: + elif cnum >= 10 ** 6: ctext += " " val = cnum + nnum @@ -107,15 +122,16 @@ class Num2Word_DE(Num2Word_EU): def to_currency(self, val, longval=True, old=False): if old: return self.to_splitnum(val, hightxt="mark/s", lowtxt="pfennig/e", - jointxt="und",longval=longval) + jointxt="und", longval=longval) return super(Num2Word_DE, self).to_currency(val, jointxt="und", longval=longval) def to_year(self, val, longval=True): - if not (val//100)%10: + if not (val // 100) % 10: return self.to_cardinal(val) return self.to_splitnum(val, hightxt="hundert", longval=longval) + n2w = Num2Word_DE() to_card = n2w.to_cardinal to_ord = n2w.to_ordinal @@ -124,9 +140,9 @@ to_ordnum = n2w.to_ordinal_num def main(): for val in [1, 7, 8, 12, 17, 81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 3000000, 1000000, 2000001, 1000000000, 2000000000, - -21212121211221211111, -2.121212, -1.0000100]: + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 3000000, 1000000, 2000001, 1000000000, 2000000000, + -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) # n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) @@ -138,6 +154,6 @@ def main(): print(n2w.to_year(1820)) print(n2w.to_year(2001)) + if __name__ == "__main__": main() - diff --git a/num2words/lang_DK.py b/num2words/lang_DK.py index 807b0f4..0aed83b 100644 --- a/num2words/lang_DK.py +++ b/num2words/lang_DK.py @@ -17,12 +17,13 @@ from __future__ import division, unicode_literals, print_function from . import lang_EU + class Num2Word_DK(lang_EU.Num2Word_EU): def set_high_numwords(self, high): - max = 3 + 6*len(high) + max = 3 + 6 * len(high) for word, n in zip(high, range(max, 3, -6)): - self.cards[10**n] = word + "illarder" - self.cards[10**(n-3)] = word + "illioner" + self.cards[10 ** n] = word + "illarder" + self.cards[10 ** (n - 3)] = word + "illioner" def setup(self): self.negword = "minus " @@ -31,35 +32,35 @@ class Num2Word_DK(lang_EU.Num2Word_EU): self.exclude_title = ["og", "komma", "minus"] self.mid_numwords = [(1000, "tusind"), (100, "hundrede"), - (90, "halvfems"), (80, "firs"), (70, "halvfjerds"), - (60, "treds"), (50, "halvtreds"), (40, "fyrre"), - (30, "tredive")] + (90, "halvfems"), (80, "firs"), + (70, "halvfjerds"), (60, "treds"), + (50, "halvtreds"), (40, "fyrre"), (30, "tredive")] self.low_numwords = ["tyve", "nitten", "atten", "sytten", "seksten", "femten", "fjorten", "tretten", "tolv", "elleve", "ti", "ni", "otte", "syv", "seks", "fem", "fire", "tre", "to", "et", "nul"] - self.ords = { "nul" : "nul", - "et" : "f\xf8rste", - "to" : "anden", - "tre" : "tredje", - "fire" : "fjerde", - "fem" : "femte", - "seks" : "sjette", - "syv" : "syvende", - "otte" : "ottende", - "ni" : "niende", - "ti" : "tiende", - "elleve" : "ellevte", - "tolv" : "tolvte", - "tretten" : "trett", - "fjorten" : "fjort", - "femten" : "femt", - "seksten" : "sekst", - "sytten" : "sytt", - "atten" : "att", - "nitten" : "nitt", - "tyve" : "tyv"} + self.ords = {"nul": "nul", + "et": "f\xf8rste", + "to": "anden", + "tre": "tredje", + "fire": "fjerde", + "fem": "femte", + "seks": "sjette", + "syv": "syvende", + "otte": "ottende", + "ni": "niende", + "ti": "tiende", + "elleve": "ellevte", + "tolv": "tolvte", + "tretten": "trett", + "fjorten": "fjort", + "femten": "femt", + "seksten": "sekst", + "sytten": "sytt", + "atten": "att", + "nitten": "nitt", + "tyve": "tyv"} def merge(self, curr, next): ctext, cnum, ntext, nnum = curr + next @@ -69,11 +70,11 @@ class Num2Word_DK(lang_EU.Num2Word_EU): next = tuple(lst) if cnum == 1: - if nnum < 10**6 or self.ordflag: + if nnum < 10 ** 6 or self.ordflag: return next ctext = "en" if nnum > cnum: - if nnum >= 10**6: + if nnum >= 10 ** 6: ctext += " " val = cnum * nnum else: @@ -84,14 +85,13 @@ class Num2Word_DK(lang_EU.Num2Word_EU): if nnum < 10 < cnum < 100: if nnum == 1: ntext = "en" - ntext, ctext = ctext, ntext + "og" - elif cnum >= 10**6: + ntext, ctext = ctext, ntext + "og" + elif cnum >= 10 ** 6: ctext += " " val = cnum + nnum word = ctext + ntext return (word, val) - def to_ordinal(self, value): self.verify_ordinal(value) self.ordflag = True @@ -101,54 +101,57 @@ class Num2Word_DK(lang_EU.Num2Word_EU): if outword.endswith(key): outword = outword[:len(outword) - len(key)] + self.ords[key] break - if value %100 >= 30 and value %100 <= 39 or value %100 == 0: + if value % 100 >= 30 and value % 100 <= 39 or value % 100 == 0: outword += "te" - elif value % 100 > 12 or value %100 == 0: + elif value % 100 > 12 or value % 100 == 0: outword += "ende" return outword def to_ordinal_num(self, value): self.verify_ordinal(value) - vaerdte = (0,1,5,6,11,12) - if value %100 >= 30 and value %100 <= 39 or value % 100 in vaerdte: + vaerdte = (0, 1, 5, 6, 11, 12) + if value % 100 >= 30 and value % 100 <= 39 or value % 100 in vaerdte: return str(value) + "te" elif value % 100 == 2: return str(value) + "en" return str(value) + "ende" - def to_currency(self, val, longval=True): - if val//100 == 1 or val == 1: - ret = self.to_splitnum(val, hightxt="kr", lowtxt="\xf8re", - jointxt="og",longval=longval) - return "en " + ret[3:] + if val // 100 == 1 or val == 1: + ret = self.to_splitnum(val, hightxt="kr", lowtxt="\xf8re", + jointxt="og", longval=longval) + return "en " + ret[3:] return self.to_splitnum(val, hightxt="kr", lowtxt="\xf8re", - jointxt="og",longval=longval) + jointxt="og", longval=longval) def to_year(self, val, longval=True): if val == 1: return 'en' - if not (val//100)%10: + if not (val // 100) % 10: return self.to_cardinal(val) return self.to_splitnum(val, hightxt="hundrede", longval=longval) + n2w = Num2Word_DK() to_card = n2w.to_cardinal to_ord = n2w.to_ordinal to_ordnum = n2w.to_ordinal_num to_year = n2w.to_year + def main(): - for val in [ 1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, - -21212121211221211111, -2.121212, -1.0000100]: + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) - n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) - for val in [1,120, 160, 1000,1120,1800, 1976,2000,2010,2099,2171]: + n2w.test( + 1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + for val in [1, 120, 160, 1000, 1120, 1800, 1976, 2000, 2010, 2099, 2171]: print(val, "er", n2w.to_currency(val)) print(val, "er", n2w.to_year(val)) n2w.test(65132) + if __name__ == "__main__": main() diff --git a/num2words/lang_EN.py b/num2words/lang_EN.py index 656abfc..cd718c9 100644 --- a/num2words/lang_EN.py +++ b/num2words/lang_EN.py @@ -17,11 +17,12 @@ from __future__ import division, unicode_literals, print_function from . import lang_EU + class Num2Word_EN(lang_EU.Num2Word_EU): def set_high_numwords(self, high): - max = 3 + 3*len(high) + max = 3 + 3 * len(high) for word, n in zip(high, range(max, 3, -3)): - self.cards[10**n] = word + "illion" + self.cards[10 ** n] = word + "illion" def setup(self): self.negword = "minus " @@ -38,28 +39,26 @@ class Num2Word_EN(lang_EU.Num2Word_EU): "twelve", "eleven", "ten", "nine", "eight", "seven", "six", "five", "four", "three", "two", "one", "zero"] - self.ords = { "one" : "first", - "two" : "second", - "three" : "third", - "five" : "fifth", - "eight" : "eighth", - "nine" : "ninth", - "twelve" : "twelfth" } - + self.ords = {"one": "first", + "two": "second", + "three": "third", + "five": "fifth", + "eight": "eighth", + "nine": "ninth", + "twelve": "twelfth"} def merge(self, lpair, rpair): ltext, lnum = lpair rtext, rnum = rpair if lnum == 1 and rnum < 100: return (rtext, rnum) - elif 100 > lnum > rnum : - return ("%s-%s"%(ltext, rtext), lnum + rnum) + elif 100 > lnum > rnum: + return ("%s-%s" % (ltext, rtext), lnum + rnum) elif lnum >= 100 > rnum: - return ("%s and %s"%(ltext, rtext), lnum + rnum) + return ("%s and %s" % (ltext, rtext), lnum + rnum) elif rnum > lnum: - return ("%s %s"%(ltext, rtext), lnum * rnum) - return ("%s, %s"%(ltext, rtext), lnum + rnum) - + return ("%s %s" % (ltext, rtext), lnum * rnum) + return ("%s, %s" % (ltext, rtext), lnum + rnum) def to_ordinal(self, value): self.verify_ordinal(value) @@ -76,21 +75,19 @@ class Num2Word_EN(lang_EU.Num2Word_EU): outwords[-1] = "-".join(lastwords) return " ".join(outwords) - def to_ordinal_num(self, value): self.verify_ordinal(value) - return "%s%s"%(value, self.to_ordinal(value)[-2:]) - + return "%s%s" % (value, self.to_ordinal(value)[-2:]) def to_year(self, val, longval=True): - if not (val//100)%10: + if not (val // 100) % 10: return self.to_cardinal(val) return self.to_splitnum(val, hightxt="hundred", jointxt="and", longval=longval) def to_currency(self, val, longval=True): return self.to_splitnum(val, hightxt="dollar/s", lowtxt="cent/s", - jointxt="and", longval=longval, cents = True) + jointxt="and", longval=longval, cents=True) n2w = Num2Word_EN() @@ -99,14 +96,16 @@ to_ord = n2w.to_ordinal to_ordnum = n2w.to_ordinal_num to_year = n2w.to_year + def main(): - for val in [ 1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, - -21212121211221211111, -2.121212, -1.0000100]: + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) - n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) - for val in [1,120,1000,1120,1800, 1976,2000,2010,2099,2171]: + n2w.test( + 1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + for val in [1, 120, 1000, 1120, 1800, 1976, 2000, 2010, 2099, 2171]: print(val, "is", n2w.to_currency(val)) print(val, "is", n2w.to_year(val)) diff --git a/num2words/lang_EN_EUR.py b/num2words/lang_EN_EUR.py index 503484b..36bb09e 100644 --- a/num2words/lang_EN_EUR.py +++ b/num2words/lang_EN_EUR.py @@ -14,13 +14,14 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301 USA -from __future__ import unicode_literals +from __future__ import unicode_literals, print_function from .lang_EN import Num2Word_EN - + + class Num2Word_EN_EUR(Num2Word_EN): def to_currency(self, val, longval=True, cents=True, jointxt="and"): return self.to_splitnum(val, hightxt="euro/s", lowtxt="cents", - jointxt=jointxt, longval=longval, cents = cents) + jointxt=jointxt, longval=longval, cents=cents) n2w = Num2Word_EN_EUR() @@ -30,17 +31,19 @@ to_ordnum = n2w.to_ordinal_num to_year = n2w.to_year to_currency = n2w.to_currency + def main(): - for val in [ 1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, - -21212121211221211111, -2.121212, -1.0000100]: + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) - n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) - for val in [1,120,1000,1120,1800, 1976,2000,2010,2099,2171]: - print val, "is", n2w.to_currency(val) - print val, "is", n2w.to_year(val) - + n2w.test( + 1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + for val in [1, 120, 1000, 1120, 1800, 1976, 2000, 2010, 2099, 2171]: + print(val, "is", n2w.to_currency(val)) + print(val, "is", n2w.to_year(val)) + if __name__ == "__main__": main() diff --git a/num2words/lang_EN_GB.py b/num2words/lang_EN_GB.py index a01c41a..89d8c94 100644 --- a/num2words/lang_EN_GB.py +++ b/num2words/lang_EN_GB.py @@ -30,14 +30,16 @@ to_ord = n2w.to_ordinal to_ordnum = n2w.to_ordinal_num to_year = n2w.to_year + def main(): - for val in [ 1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, - -21212121211221211111, -2.121212, -1.0000100]: + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) - n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) - for val in [1,120,1000,1120,1800, 1976,2000,2010,2099,2171]: + n2w.test( + 1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + for val in [1, 120, 1000, 1120, 1800, 1976, 2000, 2010, 2099, 2171]: print(val, "is", n2w.to_currency(val)) print(val, "is", n2w.to_year(val)) diff --git a/num2words/lang_EN_GB_old.py b/num2words/lang_EN_GB_old.py index 34a86fc..217bb73 100644 --- a/num2words/lang_EN_GB_old.py +++ b/num2words/lang_EN_GB_old.py @@ -14,9 +14,10 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301 USA -from __future__ import unicode_literals +from __future__ import unicode_literals, print_function from .lang_EN_GB import Num2Word_EN_GB + class Num2Word_EN_GB_old(Num2Word_EN_GB): def base_setup(self): sclass = super(Num2Word_EN_GB, self) @@ -29,17 +30,20 @@ to_card = n2w.to_cardinal to_ord = n2w.to_ordinal to_ordnum = n2w.to_ordinal_num + def main(): - for val in [ 1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, - -21212121211221211111, -2.121212, -1.0000100]: + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) - n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) - for val in [1,120,1000,1120,1800, 1976,2000,2010,2099,2171]: - print val, "is", n2w.to_currency(val) - print val, "is", n2w.to_year(val) + n2w.test( + 1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + for val in [1, 120, 1000, 1120, 1800, 1976, 2000, 2010, 2099, 2171]: + print(val, "is", n2w.to_currency(val)) + print(val, "is", n2w.to_year(val)) + if __name__ == "__main__": main() diff --git a/num2words/lang_EN_IN.py b/num2words/lang_EN_IN.py index 3093269..26ee90a 100644 --- a/num2words/lang_EN_IN.py +++ b/num2words/lang_EN_IN.py @@ -16,11 +16,12 @@ from __future__ import unicode_literals from .lang_EN import Num2Word_EN - + + class Num2Word_EN_IN(Num2Word_EN): def set_high_numwords(self, high): - self.cards[10**7] = "crore" - self.cards[10**5] = "lakh" + self.cards[10 ** 7] = "crore" + self.cards[10 ** 5] = "lakh" n2w = Num2Word_EN_IN() @@ -28,15 +29,17 @@ to_card = n2w.to_cardinal to_ord = n2w.to_ordinal to_ordnum = n2w.to_ordinal_num + def main(): for val in (15000, - 15*10**5, - 15*10**6, - 15*10**7, - 15*10**8, - 15*10**9, - 15*10**10): + 15 * 10 ** 5, + 15 * 10 ** 6, + 15 * 10 ** 7, + 15 * 10 ** 8, + 15 * 10 ** 9, + 15 * 10 ** 10): n2w.test(val) + if __name__ == "__main__": main() diff --git a/num2words/lang_ES.py b/num2words/lang_ES.py index 79222ff..dff726d 100644 --- a/num2words/lang_ES.py +++ b/num2words/lang_ES.py @@ -21,13 +21,12 @@ from .lang_EU import Num2Word_EU class Num2Word_ES(Num2Word_EU): - # //CHECK: Is this sufficient?? def set_high_numwords(self, high): - max = 3 + 6*len(high) + max = 3 + 6 * len(high) for word, n in zip(high, range(max, 3, -6)): - self.cards[10**(n-3)] = word + "illón" + self.cards[10 ** (n - 3)] = word + "illón" def setup(self): lows = ["cuatr", "tr", "b", "m"] @@ -35,12 +34,15 @@ class Num2Word_ES(Num2Word_EU): self.negword = "menos " self.pointword = "punto" self.errmsg_nonnum = "Solo números pueden ser convertidos a palabras." - self.errmsg_toobig = "Numero muy grande para ser convertido a palabras." + self.errmsg_toobig = ( + "Numero muy grande para ser convertido a palabras." + ) self.gender_stem = "o" self.exclude_title = ["y", "menos", "punto"] self.mid_numwords = [(1000, "mil"), (100, "cien"), (90, "noventa"), (80, "ochenta"), (70, "setenta"), (60, "sesenta"), - (50, "cincuenta"), (40, "cuarenta"), (30, "treinta")] + (50, "cincuenta"), (40, "cuarenta"), + (30, "treinta")] self.low_numwords = ["veintinueve", "veintiocho", "veintisiete", "veintiséis", "veinticinco", "veinticuatro", "veintitrés", "veintidós", "veintiuno", @@ -48,38 +50,38 @@ class Num2Word_ES(Num2Word_EU): "dieciseis", "quince", "catorce", "trece", "doce", "once", "diez", "nueve", "ocho", "siete", "seis", "cinco", "cuatro", "tres", "dos", "uno", "cero"] - self.ords = { 1 : "primer", - 2 : "segund", - 3 : "tercer", - 4 : "cuart", - 5 : "quint", - 6 : "sext", - 7 : "séptim", - 8 : "octav", - 9 : "noven", - 10 : "décim", - 20 : "vigésim", - 30 : "trigésim", - 40 : "quadragésim", - 50 : "quincuagésim", - 60 : "sexagésim", - 70 : "septuagésim", - 80 : "octogésim", - 90 : "nonagésim", - 100 : "centésim", - 200 : "ducentésim", - 300 : "tricentésim", - 400 : "cuadrigentésim", - 500 : "quingentésim", - 600 : "sexcentésim", - 700 : "septigentésim", - 800 : "octigentésim", - 900 : "noningentésim", - 1e3 : "milésim", - 1e6 : "millonésim", - 1e9 : "billonésim", - 1e12 : "trillonésim", - 1e15 : "cuadrillonésim" } + self.ords = {1: "primer", + 2: "segund", + 3: "tercer", + 4: "cuart", + 5: "quint", + 6: "sext", + 7: "séptim", + 8: "octav", + 9: "noven", + 10: "décim", + 20: "vigésim", + 30: "trigésim", + 40: "quadragésim", + 50: "quincuagésim", + 60: "sexagésim", + 70: "septuagésim", + 80: "octogésim", + 90: "nonagésim", + 100: "centésim", + 200: "ducentésim", + 300: "tricentésim", + 400: "cuadrigentésim", + 500: "quingentésim", + 600: "sexcentésim", + 700: "septigentésim", + 800: "octigentésim", + 900: "noningentésim", + 1e3: "milésim", + 1e6: "millonésim", + 1e9: "billonésim", + 1e12: "trillonésim", + 1e15: "cuadrillonésim"} def merge(self, curr, next): ctext, cnum, ntext, nnum = curr + next @@ -93,8 +95,8 @@ class Num2Word_ES(Num2Word_EU): if nnum < cnum: if cnum < 100: - return "%s y %s"%(ctext, ntext), cnum + nnum - return "%s %s"%(ctext, ntext), cnum + nnum + return "%s y %s" % (ctext, ntext), cnum + nnum + return "%s %s" % (ctext, ntext), cnum + nnum elif (not nnum % 1000000) and cnum > 1: ntext = ntext[:-3] + "lones" @@ -121,13 +123,22 @@ class Num2Word_ES(Num2Word_EU): elif value <= 10: text = "%s%s" % (self.ords[value], self.gender_stem) elif value <= 12: - text = "%s%s%s" % (self.ords[10], self.gender_stem, self.to_ordinal(value - 10)) + text = ( + "%s%s%s" % (self.ords[10], self.gender_stem, + self.to_ordinal(value - 10)) + ) elif value <= 100: dec = (value // 10) * 10 - text = "%s%s %s" % (self.ords[dec], self.gender_stem, self.to_ordinal(value - dec)) + text = ( + "%s%s %s" % (self.ords[dec], self.gender_stem, + self.to_ordinal(value - dec)) + ) elif value <= 1e3: cen = (value // 100) * 100 - text = "%s%s %s" % (self.ords[cen], self.gender_stem, self.to_ordinal(value - cen)) + text = ( + "%s%s %s" % (self.ords[cen], self.gender_stem, + self.to_ordinal(value - cen)) + ) elif value < 1e18: # dec contains the following: # [ 1e3, 1e6): 1e3 @@ -137,8 +148,13 @@ class Num2Word_ES(Num2Word_EU): # [1e15, 1e18): 1e15 dec = 10 ** ((((len(str(int(value))) - 1) / 3 - 1) + 1) * 3) part = int(float(value / dec) * dec) - cardinal = self.to_cardinal(part / dec) if part / dec != 1 else "" - text = "%s%s%s %s" % (cardinal, self.ords[dec], self.gender_stem, self.to_ordinal(value - part)) + cardinal = ( + self.to_cardinal(part / dec) if part / dec != 1 else "" + ) + text = ( + "%s%s%s %s" % (cardinal, self.ords[dec], self.gender_stem, + self.to_ordinal(value - part)) + ) else: text = self.to_cardinal(value) except KeyError: @@ -170,10 +186,12 @@ def main(): -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) - n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + n2w.test( + 1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) print(n2w.to_currency(1222)) print(n2w.to_currency(1222, old=True)) print(n2w.to_year(1222)) + if __name__ == "__main__": main() diff --git a/num2words/lang_ES_VE.py b/num2words/lang_ES_VE.py index 974daf3..392d979 100644 --- a/num2words/lang_ES_VE.py +++ b/num2words/lang_ES_VE.py @@ -23,9 +23,11 @@ from .lang_ES import Num2Word_ES class Num2Word_ES_VE(Num2Word_ES): def to_currency(self, val, longval=True, old=False): - return self.to_splitnum(val, hightxt="bolívar/es Fuerte/s", lowtxt="bolívar/es fuerte/s", + return self.to_splitnum(val, hightxt="bolívar/es Fuerte/s", + lowtxt="bolívar/es fuerte/s", divisor=1000, jointxt="y", longval=longval) + n2w = Num2Word_ES_VE() to_card = n2w.to_cardinal to_ord = n2w.to_ordinal diff --git a/num2words/lang_EU.py b/num2words/lang_EU.py index bdb2d32..e8af139 100644 --- a/num2words/lang_EU.py +++ b/num2words/lang_EU.py @@ -17,24 +17,23 @@ from __future__ import unicode_literals from .base import Num2Word_Base + class Num2Word_EU(Num2Word_Base): def set_high_numwords(self, high): - max = 3 + 6*len(high) + max = 3 + 6 * len(high) for word, n in zip(high, range(max, 3, -6)): - self.cards[10**n] = word + "illiard" - self.cards[10**(n-3)] = word + "illion" + self.cards[10 ** n] = word + "illiard" + self.cards[10 ** (n - 3)] = word + "illion" - def base_setup(self): - lows = ["non","oct","sept","sext","quint","quadr","tr","b","m"] + lows = ["non", "oct", "sept", "sext", "quint", "quadr", "tr", "b", "m"] units = ["", "un", "duo", "tre", "quattuor", "quin", "sex", "sept", "octo", "novem"] tens = ["dec", "vigint", "trigint", "quadragint", "quinquagint", "sexagint", "septuagint", "octogint", "nonagint"] - self.high_numwords = ["cent"]+self.gen_high_numwords(units, tens, lows) + self.high_numwords = ["cent"] + self.gen_high_numwords(units, tens, lows) def to_currency(self, val, longval=True, jointxt=""): return self.to_splitnum(val, hightxt="Euro/s", lowtxt="Euro cent/s", jointxt=jointxt, longval=longval) - diff --git a/num2words/lang_FR.py b/num2words/lang_FR.py index b151f12..c5d62a1 100644 --- a/num2words/lang_FR.py +++ b/num2words/lang_FR.py @@ -25,7 +25,9 @@ class Num2Word_FR(Num2Word_EU): self.negword = "moins " self.pointword = "virgule" - self.errmsg_nonnum = u"Seulement des nombres peuvent être convertis en mots." + self.errmsg_nonnum = ( + u"Seulement des nombres peuvent être convertis en mots." + ) self.errmsg_toobig = u"Nombre trop grand pour être converti en mots." self.exclude_title = ["et", "virgule", "moins"] self.mid_numwords = [(1000, "mille"), (100, "cent"), @@ -41,7 +43,6 @@ class Num2Word_FR(Num2Word_EU): "neuf": "neuvième", } - def merge(self, curr, next): ctext, cnum, ntext, nnum = curr + next @@ -49,24 +50,23 @@ class Num2Word_FR(Num2Word_EU): if nnum < 1000000: return next else: - if (not (cnum - 80)%100 or not cnum%100) and ctext[-1] == "s": + if (not (cnum - 80) % 100 or not cnum % 100) and ctext[-1] == "s": ctext = ctext[:-1] if cnum < 1000 and nnum != 1000 and ntext[-1] != "s" and not nnum % 100: ntext += "s" if nnum < cnum < 100: if nnum % 10 == 1 and cnum != 80: - return ("%s et %s"%(ctext, ntext), cnum + nnum) - return ("%s-%s"%(ctext, ntext), cnum + nnum) + return ("%s et %s" % (ctext, ntext), cnum + nnum) + return ("%s-%s" % (ctext, ntext), cnum + nnum) if nnum > cnum: - return ("%s %s"%(ctext, ntext), cnum * nnum) - return ("%s %s"%(ctext, ntext), cnum + nnum) - + return ("%s %s" % (ctext, ntext), cnum * nnum) + return ("%s %s" % (ctext, ntext), cnum + nnum) # Is this right for such things as 1001 - "mille unième" instead of # "mille premier"?? "millième"?? - def to_ordinal(self,value): + def to_ordinal(self, value): self.verify_ordinal(value) if value == 1: return "premier" @@ -84,7 +84,7 @@ class Num2Word_FR(Num2Word_EU): def to_ordinal_num(self, value): self.verify_ordinal(value) out = str(value) - out += {"1" : "er"}.get(out[-1], "me") + out += {"1": "er"}.get(out[-1], "me") return out def to_currency(self, val, longval=True, old=False): @@ -94,11 +94,13 @@ class Num2Word_FR(Num2Word_EU): return self.to_splitnum(val, hightxt=hightxt, lowtxt="centime/s", jointxt="et", longval=longval) + n2w = Num2Word_FR() to_card = n2w.to_cardinal to_ord = n2w.to_ordinal to_ordnum = n2w.to_ordinal_num + def main(): for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, @@ -106,7 +108,8 @@ def main(): -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) - n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + n2w.test( + 1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) print(n2w.to_currency(112121)) print(n2w.to_year(1996)) diff --git a/num2words/lang_FR_CH.py b/num2words/lang_FR_CH.py index 032c86f..716d89a 100644 --- a/num2words/lang_FR_CH.py +++ b/num2words/lang_FR_CH.py @@ -24,10 +24,9 @@ class Num2Word_FR_CH(Num2Word_FR): Num2Word_FR.setup(self) self.mid_numwords = [(1000, "mille"), (100, "cent"), (90, "nonante"), - (80, "huitante"), (70, "septante"), (60, "soixante"), - (50, "cinquante"), (40, "quarante"), - (30, "trente")] - + (80, "huitante"), (70, "septante"), + (60, "soixante"), (50, "cinquante"), + (40, "quarante"), (30, "trente")] def merge(self, curr, next): ctext, cnum, ntext, nnum = curr + next @@ -41,11 +40,11 @@ class Num2Word_FR_CH(Num2Word_FR): if nnum < cnum < 100: if nnum % 10 == 1: - return ("%s et %s"%(ctext, ntext), cnum + nnum) - return ("%s-%s"%(ctext, ntext), cnum + nnum) + return ("%s et %s" % (ctext, ntext), cnum + nnum) + return ("%s-%s" % (ctext, ntext), cnum + nnum) if nnum > cnum: - return ("%s %s"%(ctext, ntext), cnum * nnum) - return ("%s %s"%(ctext, ntext), cnum + nnum) + return ("%s %s" % (ctext, ntext), cnum * nnum) + return ("%s %s" % (ctext, ntext), cnum + nnum) n2w = Num2Word_FR_CH() @@ -53,6 +52,7 @@ to_card = n2w.to_cardinal to_ord = n2w.to_ordinal to_ordnum = n2w.to_ordinal_num + def main(): for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, @@ -60,7 +60,8 @@ def main(): -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) - n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + n2w.test( + 1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) print(n2w.to_currency(112121)) print(n2w.to_year(1996)) diff --git a/num2words/lang_FR_DZ.py b/num2words/lang_FR_DZ.py index 5fddbf8..09c6576 100644 --- a/num2words/lang_FR_DZ.py +++ b/num2words/lang_FR_DZ.py @@ -31,6 +31,7 @@ to_ordnum = n2w.to_ordinal_num to_year = n2w.to_year to_currency = n2w.to_currency + def main(): for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, @@ -38,7 +39,8 @@ def main(): -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) - n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) + n2w.test( + 1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) for val in [1, 120, 1000, 1120, 1800, 1976, 2000, 2010, 2099, 2171]: print(val, "is", n2w.to_currency(val)) print(val, "is", n2w.to_year(val)) diff --git a/num2words/lang_HE.py b/num2words/lang_HE.py index 15e67c8..b5b3443 100644 --- a/num2words/lang_HE.py +++ b/num2words/lang_HE.py @@ -69,6 +69,7 @@ THOUSANDS = { AND = u'ו' + def splitby3(n): length = len(n) if length > 3: @@ -76,7 +77,7 @@ def splitby3(n): if start > 0: yield int(n[:start]) for i in range(start, length, 3): - yield int(n[i:i+3]) + yield int(n[i:i + 3]) else: yield int(n) @@ -95,7 +96,7 @@ def pluralize(n, forms): def int2word(n): - if n > 9999: #doesn't yet work for numbers this big + if n > 9999: # doesn't yet work for numbers this big raise NotImplementedError() if n == 0: @@ -159,4 +160,3 @@ if __name__ == '__main__': nums = [1, 11, 21, 24, 99, 100, 101, 200, 211, 345, 1000, 1011] for num in nums: print(num, yo.to_cardinal(num)) - diff --git a/num2words/lang_ID.py b/num2words/lang_ID.py index 9437db7..333b098 100644 --- a/num2words/lang_ID.py +++ b/num2words/lang_ID.py @@ -16,8 +16,8 @@ from __future__ import unicode_literals, print_function -class Num2Word_ID(): +class Num2Word_ID(): BASE = {0: [], 1: ["satu"], 2: ["dua"], @@ -44,7 +44,7 @@ class Num2Word_ID(): errmsg_floatord = "Cannot treat float number as ordinal" errmsg_negord = "Cannot treat negative number as ordinal" errmsg_toobig = "Too large" - max_num = 10**36 + max_num = 10 ** 36 def split_by_koma(self, number): return str(number).split('.') @@ -69,7 +69,7 @@ class Num2Word_ID(): blocks += first_block, for i in range(len_of_first_block, length, 3): - next_block = (number[i:i+3],), + next_block = (number[i:i + 3],), blocks += next_block return blocks @@ -77,7 +77,9 @@ class Num2Word_ID(): def spell(self, blocks): """ it adds the list of spelling to the blocks - (('1',),('034',)) -> (('1',['satu']),('234',['tiga', 'puluh', 'empat'])) + ( + ('1',),('034',)) -> (('1',['satu']),('234',['tiga', 'puluh', 'empat']) + ) :param blocks: tuple :rtype: tuple """ @@ -91,7 +93,9 @@ class Num2Word_ID(): elif len(first_block[0]) == 2: spelling = self.puluh(first_block[0]) else: - spelling = self.ratus(first_block[0][0]) + self.puluh(first_block[0][1:3]) + spelling = ( + self.ratus(first_block[0][0]) + self.puluh(first_block[0][1:3]) + ) word_blocks += (first_block[0], spelling), @@ -109,21 +113,23 @@ class Num2Word_ID(): elif number == '0': return [] else: - return self.BASE[int(number)]+['ratus'] + return self.BASE[int(number)] + ['ratus'] def puluh(self, number): # it is used to spell if number[0] == '1': - if number[1]== '0': + if number[1] == '0': return ['sepuluh'] elif number[1] == '1': return ['sebelas'] else: - return self.BASE[int(number[1])]+['belas'] + return self.BASE[int(number[1])] + ['belas'] elif number[0] == '0': return self.BASE[int(number[1])] else: - return self.BASE[int(number[0])]+['puluh']+ self.BASE[int(number[1])] + return ( + self.BASE[int(number[0])] + ['puluh'] + self.BASE[int(number[1])] + ) def spell_float(self, float_part): # spell the float number @@ -133,7 +139,7 @@ class Num2Word_ID(): word_list += ['nol'] continue word_list += self.BASE[int(n)] - return ' '.join(['','koma']+word_list) + return ' '.join(['', 'koma'] + word_list) def join(self, word_blocks, float_part): """ @@ -142,7 +148,7 @@ class Num2Word_ID(): :rtype: str """ word_list = [] - length = len(word_blocks)-1 + length = len(word_blocks) - 1 first_block = word_blocks[0], start = 0 @@ -150,15 +156,15 @@ class Num2Word_ID(): word_list += ['seribu'] start = 1 - for i in range(start, length+1, 1): + for i in range(start, length + 1, 1): word_list += word_blocks[i][1] if not word_blocks[i][1]: continue if i == length: break - word_list += [self.TENS_TO[(length-i)*3]] + word_list += [self.TENS_TO[(length - i) * 3]] - return ' '.join(word_list)+float_part + return ' '.join(word_list) + float_part def to_cardinal(self, number): if number >= self.max_num: @@ -168,7 +174,7 @@ class Num2Word_ID(): minus = 'min ' float_word = '' n = self.split_by_koma(abs(number)) - if len(n)==2: + if len(n) == 2: float_word = self.spell_float(n[1]) return minus + self.join(self.spell(self.split_by_3(n[0])), float_word) @@ -184,7 +190,7 @@ class Num2Word_ID(): return "ke-" + str(number) def to_currency(self, value): - return self.to_cardinal(value)+" rupiah" + return self.to_cardinal(value) + " rupiah" def to_year(self, value): return self.to_cardinal(value) diff --git a/num2words/lang_IT.py b/num2words/lang_IT.py index 8e3cae4..d421b85 100644 --- a/num2words/lang_IT.py +++ b/num2words/lang_IT.py @@ -42,16 +42,18 @@ EXPONENT_PREFIXES = [ ZERO, "m", "b", "tr", "quadr", "quint", "sest", "sett", "ott", "nov", "dec" ] + # Utils # ===== def phonetic_contraction(string): return (string - .replace("oo", "o") # ex. "centootto" - .replace("ao", "o") # ex. "settantaotto" - .replace("io", "o") # ex. "ventiotto" - .replace("au", "u") # ex. "trentauno" - ) + .replace("oo", "o") # ex. "centootto" + .replace("ao", "o") # ex. "settantaotto" + .replace("io", "o") # ex. "ventiotto" + .replace("au", "u") # ex. "trentauno" + ) + def exponent_length_to_string(exponent_length): # We always assume `exponent` to be a multiple of 3. If it's not true, then @@ -62,6 +64,7 @@ def exponent_length_to_string(exponent_length): else: return prefix + "iliardo" + def accentuate(string): # This is inefficient: it may do several rewritings when deleting # half-sentence accents. However, it is the easiest method and speed is @@ -69,23 +72,24 @@ def accentuate(string): return " ".join( # Deletes half-sentence accents and accentuates the last "tre" [w.replace("tré", "tre")[:-3] + "tré" - # We shouldn't accentuate a single "tre": is has to be a composite - # word. ~~~~~~~~~~ - if w[-3:] == "tre" and len(w) > 3 - # Deletes half-sentence accents anyway - # ~~~~~~~~~~~~~~~~~~~~~~ - else w.replace("tré", "tre") - for w in string.split() - ]) + # We shouldn't accentuate a single "tre": is has to be a composite + # word. ~~~~~~~~~~ + if w[-3:] == "tre" and len(w) > 3 + # Deletes half-sentence accents anyway + # ~~~~~~~~~~~~~~~~~~~~~~ + else w.replace("tré", "tre") + for w in string.split() + ]) + def omitt_if_zero(number_to_string): return "" if number_to_string == ZERO else number_to_string + # Main class # ========== class Num2Word_IT: - MINUS_PREFIX_WORD = "meno " FLOAT_INFIX_WORD = " virgola " diff --git a/num2words/lang_LT.py b/num2words/lang_LT.py index a274e4a..ed8f462 100644 --- a/num2words/lang_LT.py +++ b/num2words/lang_LT.py @@ -153,6 +153,7 @@ CURRENCIES = { 'EUR': ((u'euras', u'eurai', u'eurų'), (u'centas', u'centai', u'centų')), } + def splitby3(n): length = len(n) if length > 3: @@ -160,7 +161,7 @@ def splitby3(n): if start > 0: yield int(n[:start]) for i in range(start, length, 3): - yield int(n[i:i+3]) + yield int(n[i:i + 3]) else: yield int(n) @@ -168,6 +169,7 @@ def splitby3(n): def get_digits(n): return [int(x) for x in reversed(list(('%03d' % n)[-3:]))] + def pluralize(n, forms): n1, n2, n3 = get_digits(n) if n2 == 1 or n1 == 0 or n == 0: @@ -177,6 +179,7 @@ def pluralize(n, forms): else: return forms[1] + def int2word(n): if n == 0: return ZERO[0] @@ -209,6 +212,7 @@ def int2word(n): return ' '.join(words) + def n2w(n): n = str(n).replace(',', '.') if '.' in n: @@ -217,7 +221,8 @@ def n2w(n): else: return int2word(int(n)) -def to_currency(n, currency='EUR', cents = True): + +def to_currency(n, currency='EUR', cents=True): if type(n) == int: if n < 0: minus = True @@ -247,8 +252,10 @@ def to_currency(n, currency='EUR', cents = True): else: cents_str = "%02d" % right - return u'%s%s %s, %s %s' % (minus_str, int2word(left), pluralize(left, cr1), - cents_str, pluralize(right, cr2)) + return u'%s%s %s, %s %s' % (minus_str, int2word(left), + pluralize(left, cr1), + cents_str, pluralize(right, cr2)) + class Num2Word_LT(object): def to_cardinal(self, number): @@ -257,6 +264,8 @@ class Num2Word_LT(object): def to_ordinal(self, number): raise NotImplementedError() + if __name__ == '__main__': import doctest + doctest.testmod() diff --git a/num2words/lang_NL.py b/num2words/lang_NL.py index 5bbaa0a..ac01641 100644 --- a/num2words/lang_NL.py +++ b/num2words/lang_NL.py @@ -18,21 +18,35 @@ from __future__ import unicode_literals, print_function from .lang_EU import Num2Word_EU + class Num2Word_NL(Num2Word_EU): def set_high_numwords(self, high): - max = 3 + 6*len(high) + max = 3 + 6 * len(high) for word, n in zip(high, range(max, 3, -6)): - self.cards[10**n] = word + "iljard" - self.cards[10**(n-3)] = word + "iljoen" + self.cards[10 ** n] = word + "iljard" + self.cards[10 ** (n - 3)] = word + "iljoen" def setup(self): self.negword = "min " self.pointword = "komma" - self.errmsg_floatord = "Het zwevende puntnummer %s kan niet omgezet worden naar een ordernummer." # "Cannot treat float %s as ordinal." - self.errmsg_nonnum = "Alleen nummers (type (%s)) kunnen naar woorden omgezet worden." # "type(((type(%s)) ) not in [long, int, float]" - self.errmsg_negord = "Het negatieve getal %s kan niet omgezet worden naar een ordernummer." # "Cannot treat negative num %s as ordinal." - self.errmsg_toobig = "Het getal %s moet minder zijn dan %s." # "abs(%s) must be less than %s." + # "Cannot treat float %s as ordinal." + self.errmsg_floatord = ( + "Het zwevende puntnummer %s kan niet omgezet worden " + + "naar een ordernummer." + ) + # "type(((type(%s)) ) not in [long, int, float]" + self.errmsg_nonnum = ( + "Alleen nummers (type (%s)) kunnen naar " + + "woorden omgezet worden." + ) + # "Cannot treat negative num %s as ordinal." + self.errmsg_negord = ( + "Het negatieve getal %s kan niet omgezet " + + "worden naar een ordernummer." + ) + # "abs(%s) must be less than %s." + self.errmsg_toobig = "Het getal %s moet minder zijn dan %s." self.exclude_title = [] lows = ["non", "okt", "sept", "sext", "quint", "quadr", "tr", "b", "m"] @@ -41,13 +55,13 @@ class Num2Word_NL(Num2Word_EU): tens = ["dez", "vigint", "trigint", "quadragint", "quinquagint", "sexagint", "septuagint", "oktogint", "nonagint"] - - - - self.high_numwords = ["zend"]+self.gen_high_numwords(units, tens, lows) + self.high_numwords = ( + ["zend"] + self.gen_high_numwords(units, tens, lows) + ) self.mid_numwords = [(1000, "duizend"), (100, "honderd"), - (90, "negentig"), (80, "tachtig"), (70, "zeventig"), - (60, "zestig"), (50, "vijftig"), (40, "veertig"), + (90, "negentig"), (80, "tachtig"), + (70, "zeventig"), (60, "zestig"), + (50, "vijftig"), (40, "veertig"), (30, "dertig")] self.low_numwords = ["twintig", "negentien", "achttien", "zeventien", "zestien", "vijftien", "veertien", "dertien", @@ -56,17 +70,17 @@ class Num2Word_NL(Num2Word_EU): "nul"] self.ords = {"één": "eerst", - "twee": "tweed", + "twee": "tweed", "drie": "derd", "vier": "vierd", "vijf": "vijfd", "zes": "zesd", - "zeven": "zevend", + "zeven": "zevend", "acht": "achtst", "negen": "negend", - "tien":"tiend", - "elf":"elfd", - "twaalf":"twaalfd", + "tien": "tiend", + "elf": "elfd", + "twaalf": "twaalfd", "ig": "igst", "erd": "erdst", @@ -78,12 +92,12 @@ class Num2Word_NL(Num2Word_EU): ctext, cnum, ntext, nnum = curr + next if cnum == 1: - if nnum < 10**6: + if nnum < 10 ** 6: return next ctext = "een" if nnum > cnum: - if nnum >= 10**6: + if nnum >= 10 ** 6: ctext += " " val = cnum * nnum else: @@ -92,11 +106,11 @@ class Num2Word_NL(Num2Word_EU): ntext = "een" if ntext.endswith("e"): - ntext += "ën"#"n" + ntext += "ën" # "n" else: - ntext += "en" - ntext, ctext = ctext, ntext #+ "en" - elif cnum >= 10**6: + ntext += "en" + ntext, ctext = ctext, ntext # + "en" + elif cnum >= 10 ** 6: ctext += " " val = cnum + nnum @@ -119,15 +133,16 @@ class Num2Word_NL(Num2Word_EU): def to_currency(self, val, longval=True, old=False): if old: return self.to_splitnum(val, hightxt="euro/s", lowtxt="cent/s", - jointxt="en",longval=longval) + jointxt="en", longval=longval) return super(Num2Word_NL, self).to_currency(val, jointxt="en", longval=longval) def to_year(self, val, longval=True): - if not (val//100)%10: + if not (val // 100) % 10: return self.to_cardinal(val) return self.to_splitnum(val, hightxt="honderd", longval=longval) + n2w = Num2Word_NL() to_card = n2w.to_cardinal to_ord = n2w.to_ordinal @@ -135,10 +150,11 @@ to_ordnum = n2w.to_ordinal_num def main(): - for val in [1, 7, 8, 12, 17, 62,81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061,1062, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 3000000, 1000000, 2000001, 1000000000, 2000000000, - -21212121211221211111, -2.121212, -1.0000100]: + for val in [1, 7, 8, 12, 17, 62, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1062, 1100, 1500, 1701, + 3000, 8280, 8291, 150000, 500000, 3000000, 1000000, 2000001, + 1000000000, 2000000000, -21212121211221211111, -2.121212, + -1.0000100]: n2w.test(val) n2w.test(3000000) @@ -149,6 +165,6 @@ def main(): print(n2w.to_year(1820)) print(n2w.to_year(2001)) + if __name__ == "__main__": main() - diff --git a/num2words/lang_NO.py b/num2words/lang_NO.py index 2c744e1..53e6026 100644 --- a/num2words/lang_NO.py +++ b/num2words/lang_NO.py @@ -17,12 +17,13 @@ from __future__ import division, unicode_literals, print_function from . import lang_EU + class Num2Word_NO(lang_EU.Num2Word_EU): def set_high_numwords(self, high): - max = 3 + 6*len(high) + max = 3 + 6 * len(high) for word, n in zip(high, range(max, 3, -6)): - self.cards[10**n] = word + "illard" - self.cards[10**(n-3)] = word + "illion" + self.cards[10 ** n] = word + "illard" + self.cards[10 ** (n - 3)] = word + "illion" def setup(self): self.negword = "minus " @@ -39,34 +40,32 @@ class Num2Word_NO(lang_EU.Num2Word_EU): "tolv", "elleve", "ti", "ni", "\xe5tte", "syv", "seks", "fem", "fire", "tre", "to", "en", "null"] - self.ords = { "en" : "f\xf8rste", - "to" : "andre", - "tre" : "tredje", - "fire" : "fjerde", - "fem" : "femte", - "seks" : "sjette", - "syv" : "syvende", - "\xe5tte" : "\xe5ttende", - "ni" : "niende", - "ti" : "tiende", - "elleve" : "ellevte", - "tolv" : "tolvte", - "tjue" : "tjuende" } - + self.ords = {"en": "f\xf8rste", + "to": "andre", + "tre": "tredje", + "fire": "fjerde", + "fem": "femte", + "seks": "sjette", + "syv": "syvende", + "\xe5tte": "\xe5ttende", + "ni": "niende", + "ti": "tiende", + "elleve": "ellevte", + "tolv": "tolvte", + "tjue": "tjuende"} def merge(self, lpair, rpair): ltext, lnum = lpair rtext, rnum = rpair if lnum == 1 and rnum < 100: return (rtext, rnum) - elif 100 > lnum > rnum : - return ("%s-%s"%(ltext, rtext), lnum + rnum) + elif 100 > lnum > rnum: + return ("%s-%s" % (ltext, rtext), lnum + rnum) elif lnum >= 100 > rnum: - return ("%s og %s"%(ltext, rtext), lnum + rnum) + return ("%s og %s" % (ltext, rtext), lnum + rnum) elif rnum > lnum: - return ("%s %s"%(ltext, rtext), lnum * rnum) - return ("%s, %s"%(ltext, rtext), lnum + rnum) - + return ("%s %s" % (ltext, rtext), lnum * rnum) + return ("%s, %s" % (ltext, rtext), lnum + rnum) def to_ordinal(self, value): self.verify_ordinal(value) @@ -84,21 +83,19 @@ class Num2Word_NO(lang_EU.Num2Word_EU): outwords[-1] = "".join(lastwords) return " ".join(outwords) - def to_ordinal_num(self, value): self.verify_ordinal(value) - return "%s%s"%(value, self.to_ordinal(value)[-2:]) - + return "%s%s" % (value, self.to_ordinal(value)[-2:]) def to_year(self, val, longval=True): - if not (val//100)%10: + if not (val // 100) % 10: return self.to_cardinal(val) return self.to_splitnum(val, hightxt="hundre", jointxt="og", longval=longval) def to_currency(self, val, longval=True): return self.to_splitnum(val, hightxt="krone/r", lowtxt="\xf8re/r", - jointxt="og", longval=longval, cents = True) + jointxt="og", longval=longval, cents=True) n2w = Num2Word_NO() @@ -107,14 +104,15 @@ to_ord = n2w.to_ordinal to_ordnum = n2w.to_ordinal_num to_year = n2w.to_year + def main(): - for val in [ 1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, - -21212121211221211111, -2.121212, -1.0000100]: + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) - for val in [1,120,1000,1120,1800, 1976,2000,2010,2099,2171]: + for val in [1, 120, 1000, 1120, 1800, 1976, 2000, 2010, 2099, 2171]: print(val, "er", n2w.to_currency(val)) print(val, "er", n2w.to_year(val)) diff --git a/num2words/lang_PL.py b/num2words/lang_PL.py index c232f8a..9e81a68 100644 --- a/num2words/lang_PL.py +++ b/num2words/lang_PL.py @@ -155,16 +155,16 @@ HUNDREDS = { } THOUSANDS = { - 1: (u'tysiąc', u'tysiące', u'tysięcy'), # 10^3 - 2: (u'milion', u'miliony', u'milionów'), # 10^6 - 3: (u'miliard', u'miliardy', u'miliardów'), # 10^9 - 4: (u'bilion', u'biliony', u'bilionów'), # 10^12 - 5: (u'biliard', u'biliardy', u'biliardów'), # 10^15 - 6: (u'trylion', u'tryliony', u'trylionów'), # 10^18 - 7: (u'tryliard', u'tryliardy', u'tryliardów'), # 10^21 - 8: (u'kwadrylion', u'kwadryliony', u'kwadrylionów'), # 10^24 - 9: (u'kwaryliard', u'kwadryliardy', u'kwadryliardów'), #10^27 - 10: (u'kwintylion', u'kwintyliony', u'kwintylionów'), # 10^30 + 1: (u'tysiąc', u'tysiące', u'tysięcy'), # 10^3 + 2: (u'milion', u'miliony', u'milionów'), # 10^6 + 3: (u'miliard', u'miliardy', u'miliardów'), # 10^9 + 4: (u'bilion', u'biliony', u'bilionów'), # 10^12 + 5: (u'biliard', u'biliardy', u'biliardów'), # 10^15 + 6: (u'trylion', u'tryliony', u'trylionów'), # 10^18 + 7: (u'tryliard', u'tryliardy', u'tryliardów'), # 10^21 + 8: (u'kwadrylion', u'kwadryliony', u'kwadrylionów'), # 10^24 + 9: (u'kwaryliard', u'kwadryliardy', u'kwadryliardów'), # 10^27 + 10: (u'kwintylion', u'kwintyliony', u'kwintylionów'), # 10^30 } CURRENCIES = { @@ -235,7 +235,7 @@ def n2w(n): return int2word(int(n)) -def to_currency(n, currency = 'EUR', cents = True, seperator = ','): +def to_currency(n, currency='EUR', cents=True, seperator=','): if type(n) == int: if n < 0: minus = True @@ -287,4 +287,5 @@ class Num2Word_PL(object): if __name__ == '__main__': import doctest + doctest.testmod() diff --git a/num2words/lang_RU.py b/num2words/lang_RU.py index 846d8db..2f62e69 100644 --- a/num2words/lang_RU.py +++ b/num2words/lang_RU.py @@ -166,16 +166,16 @@ HUNDREDS = { } THOUSANDS = { - 1: (u'тысяча', u'тысячи', u'тысяч'), # 10^3 - 2: (u'миллион', u'миллиона', u'миллионов'), # 10^6 - 3: (u'миллиард', u'миллиарда', u'миллиардов'), # 10^9 - 4: (u'триллион', u'триллиона', u'триллионов'), # 10^12 - 5: (u'квадриллион', u'квадриллиона', u'квадриллионов'), # 10^15 - 6: (u'квинтиллион', u'квинтиллиона', u'квинтиллионов'), # 10^18 - 7: (u'секстиллион', u'секстиллиона', u'секстиллионов'), # 10^21 - 8: (u'септиллион', u'септиллиона', u'септиллионов'), # 10^24 - 9: (u'октиллион', u'октиллиона', u'октиллионов'), #10^27 - 10: (u'нониллион', u'нониллиона', u'нониллионов'), # 10^30 + 1: (u'тысяча', u'тысячи', u'тысяч'), # 10^3 + 2: (u'миллион', u'миллиона', u'миллионов'), # 10^6 + 3: (u'миллиард', u'миллиарда', u'миллиардов'), # 10^9 + 4: (u'триллион', u'триллиона', u'триллионов'), # 10^12 + 5: (u'квадриллион', u'квадриллиона', u'квадриллионов'), # 10^15 + 6: (u'квинтиллион', u'квинтиллиона', u'квинтиллионов'), # 10^18 + 7: (u'секстиллион', u'секстиллиона', u'секстиллионов'), # 10^21 + 8: (u'септиллион', u'септиллиона', u'септиллионов'), # 10^24 + 9: (u'октиллион', u'октиллиона', u'октиллионов'), # 10^27 + 10: (u'нониллион', u'нониллиона', u'нониллионов'), # 10^30 } CURRENCIES = { @@ -195,7 +195,7 @@ def splitby3(n): if start > 0: yield int(n[:start]) for i in range(start, length, 3): - yield int(n[i:i+3]) + yield int(n[i:i + 3]) else: yield int(n) @@ -233,7 +233,7 @@ def int2word(n, feminine=False): if n3 > 0: words.append(HUNDREDS[n3][0]) - + if n2 > 1: words.append(TWENTIES[n2][0]) @@ -309,4 +309,5 @@ class Num2Word_RU(object): if __name__ == '__main__': import doctest + doctest.testmod() diff --git a/num2words/lang_SL.py b/num2words/lang_SL.py index 4de0a90..1b8119c 100644 --- a/num2words/lang_SL.py +++ b/num2words/lang_SL.py @@ -21,6 +21,7 @@ from __future__ import unicode_literals from .lang_EU import Num2Word_EU + class Num2Word_SL(Num2Word_EU): def set_high_numwords(self, high): max = 3 + 6*len(high) @@ -29,7 +30,6 @@ class Num2Word_SL(Num2Word_EU): self.cards[10**n] = word + "iljard" self.cards[10**(n-3)] = word + "iljon" - def setup(self): self.negword = "minus " self.pointword = "celih" @@ -37,30 +37,33 @@ class Num2Word_SL(Num2Word_EU): self.errmsg_toobig = "Number is too large to convert to words." self.exclude_title = [] - self.mid_numwords = [(1000, "tisoč"), (900, "devetsto"), (800, "osemsto"), - (700, "sedemsto"), (600, "šesto"), (500, "petsto"), (400, "štiristo"), (300, "tristo"), + self.mid_numwords = [(1000, "tisoč"), (900, "devetsto"), + (800, "osemsto"), (700, "sedemsto"), + (600, "šesto"), (500, "petsto"), + (400, "štiristo"), (300, "tristo"), (200, "dvesto"), (100, "sto"), - (90, "devetdeset"), (80, "osemdeset"), (70, "sedemdeset"), - (60, "šestdeset"), (50, "petdeset"), (40, "štirideset"), + (90, "devetdeset"), (80, "osemdeset"), + (70, "sedemdeset"), (60, "šestdeset"), + (50, "petdeset"), (40, "štirideset"), (30, "trideset")] - self.low_numwords = ["dvajset", "devetnajst", "osemnajst", "sedemnajst", - "šestnajst", "petnajst", "štirinajst", "trinajst", - "dvanajst", "enajst", "deset", "devet", "osem", "sedem", + self.low_numwords = ["dvajset", "devetnajst", "osemnajst", + "sedemnajst", "šestnajst", "petnajst", + "štirinajst", "trinajst", "dvanajst", + "enajst", "deset", "devet", "osem", "sedem", "šest", "pet", "štiri", "tri", "dve", "ena", "nič"] - self.ords = { "ena" : "prv", - "dve" : "drug", - "tri" : "tretj", - "štiri" : "četrt", - "sedem" : "sedm", - "osem" : "osm", - "sto" : "stot", - "tisoč" : "tisoč", - "miljon" : "miljont" + self.ords = {"ena": "prv", + "dve": "drug", + "tri": "tretj", + "štiri": "četrt", + "sedem": "sedm", + "osem": "osm", + "sto": "stot", + "tisoč": "tisoč", + "miljon": "miljont" } self.ordflag = False - def merge(self, curr, next): ctext, cnum, ntext, nnum = curr + next @@ -97,21 +100,20 @@ class Num2Word_SL(Num2Word_EU): else: ntext += "ov" - if nnum >= 10**2 and self.ordflag == False: + if nnum >= 10**2 and self.ordflag is False: ctext += " " val = cnum * nnum else: if nnum < 10 < cnum < 100: - ntext, ctext = ctext, ntext + "in" - elif cnum >= 10**2 and self.ordflag == False: + ntext, ctext = ctext, ntext + "in" + elif cnum >= 10**2 and self.ordflag is False: ctext += " " val = cnum + nnum word = ctext + ntext return (word, val) - def to_ordinal(self, value): self.verify_ordinal(value) self.ordflag = True @@ -123,27 +125,25 @@ class Num2Word_SL(Num2Word_EU): break return outword + "i" - # Is this correct?? def to_ordinal_num(self, value): self.verify_ordinal(value) return str(value) + "." - def to_currency(self, val, longval=True, old=False): if old: - return self.to_splitnum(val, hightxt="evro/a/v", lowtxt="stotin/a/i/ov", - jointxt="in",longval=longval) + return self.to_splitnum(val, hightxt="evro/a/v", + lowtxt="stotin/a/i/ov", + jointxt="in", longval=longval) return super(Num2Word_SL, self).to_currency(val, jointxt="in", longval=longval) def to_year(self, val, longval=True): - if not (val//100)%10: + if not (val//100) % 10: return self.to_cardinal(val) return self.to_splitnum(val, hightxt="hundert", longval=longval) - n2w = Num2Word_SL() to_card = n2w.to_cardinal to_ord = n2w.to_ordinal @@ -151,15 +151,16 @@ to_ordnum = n2w.to_ordinal_num def main(): - for val in [ 1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, - 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, - 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, - -21212121211221211111, -2.121212, -1.0000100]: + for val in [1, 11, 12, 21, 31, 33, 71, 80, 81, 91, 99, 100, 101, 102, 155, + 180, 300, 308, 832, 1000, 1001, 1061, 1100, 1500, 1701, 3000, + 8280, 8291, 150000, 500000, 1000000, 2000000, 2000001, + -21212121211221211111, -2.121212, -1.0000100]: n2w.test(val) n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) print(n2w.to_currency(112121)) print(n2w.to_year(2000)) + if __name__ == "__main__": main() diff --git a/num2words/lang_TR.py b/num2words/lang_TR.py index dc3c26a..a4983a1 100644 --- a/num2words/lang_TR.py +++ b/num2words/lang_TR.py @@ -541,7 +541,8 @@ class Num2Word_TR(object): if not int(val) == 0: self.integers_to_read = [str(int(val)), float_digits[len(float_digits) - self.precision:]] else: - self.integers_to_read = ["0", "0" * (self.precision - len(float_digits)) + float_digits[len(float_digits) - self.precision:]] + self.integers_to_read = ["0", "0" * (self.precision - len(float_digits)) + + float_digits[len(float_digits) - self.precision:]] if len(self.integers_to_read[0]) % 3 > 0: self.total_triplets_to_read = (len(self.integers_to_read[0]) // 3) + 1 elif len(self.integers_to_read[0]) % 3 == 0: diff --git a/num2words/lang_UK.py b/num2words/lang_UK.py index 06d7c79..dcbaf8e 100644 --- a/num2words/lang_UK.py +++ b/num2words/lang_UK.py @@ -166,21 +166,22 @@ HUNDREDS = { } THOUSANDS = { - 1: (u'тисяча', u'тисячi', u'тисяч'), # 10^3 - 2: (u'мiльйон', u'мiльйони', u'мiльйонiв'), # 10^6 - 3: (u'мiльярд', u'мiльярди', u'мiльярдiв'), # 10^9 - 4: (u'трильйон', u'трильйони', u'трильйонiв'), # 10^12 - 5: (u'квадрильйон', u'квадрильйони', u'квадрильйонiв'), # 10^15 - 6: (u'квiнтильйон', u'квiнтильйони', u'квiнтильйонiв'), # 10^18 - 7: (u'секстильйон', u'секстильйони', u'секстильйонiв'), # 10^21 - 8: (u'септильйон', u'септильйони', u'септильйонiв'), # 10^24 - 9: (u'октильйон', u'октильйони', u'октильйонiв'), #10^27 - 10: (u'нонiльйон', u'нонiльйони', u'нонiльйонiв'), # 10^30 + 1: (u'тисяча', u'тисячi', u'тисяч'), # 10^3 + 2: (u'мiльйон', u'мiльйони', u'мiльйонiв'), # 10^6 + 3: (u'мiльярд', u'мiльярди', u'мiльярдiв'), # 10^9 + 4: (u'трильйон', u'трильйони', u'трильйонiв'), # 10^12 + 5: (u'квадрильйон', u'квадрильйони', u'квадрильйонiв'), # 10^15 + 6: (u'квiнтильйон', u'квiнтильйони', u'квiнтильйонiв'), # 10^18 + 7: (u'секстильйон', u'секстильйони', u'секстильйонiв'), # 10^21 + 8: (u'септильйон', u'септильйони', u'септильйонiв'), # 10^24 + 9: (u'октильйон', u'октильйони', u'октильйонiв'), # 10^27 + 10: (u'нонiльйон', u'нонiльйони', u'нонiльйонiв'), # 10^30 } CURRENCIES = { 'UAH': ( - (u'гривня', u'гривнi', u'гривень'), (u'копiйка', u'копiйки', u'копiйок') + (u'гривня', u'гривнi', u'гривень'), + (u'копiйка', u'копiйки', u'копiйок') ), 'EUR': ( (u'евро', u'евро', u'евро'), (u'цент', u'центи', u'центiв') @@ -195,7 +196,7 @@ def splitby3(n): if start > 0: yield int(n[:start]) for i in range(start, length, 3): - yield int(n[i:i+3]) + yield int(n[i:i + 3]) else: yield int(n) @@ -205,7 +206,8 @@ def get_digits(n): def pluralize(n, forms): - #form = 0 if n==1 else 1 if (n % 10 > 1 and n % 10 < 5 and (n % 100 < 10 or n % 100 > 20)) else 2 + # form = 0 if n==1 else 1 if (n % 10 > 1 and n % 10 < 5 and (n % 100 < 10 + # or n % 100 > 20)) else 2 if (n % 100 < 10 or n % 100 > 20): if n % 10 == 1: form = 0 @@ -215,7 +217,7 @@ def pluralize(n, forms): form = 2 else: form = 2 - + return forms[form] @@ -235,19 +237,18 @@ def int2word(n, feminine=True): if n3 > 0: words.append(HUNDREDS[n3][0]) - + if n2 > 1: words.append(TWENTIES[n2][0]) if n2 == 1: words.append(TENS[n1][0]) - #elif n1 > 0 and not (i > 0 and x == 1): + # elif n1 > 0 and not (i > 0 and x == 1): elif n1 > 0: ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES words.append(ones[n1][0]) - - if i > 0 and ((n1+n2+n3) > 0): + if i > 0 and ((n1 + n2 + n3) > 0): words.append(pluralize(x, THOUSANDS[i])) return ' '.join(words) @@ -313,4 +314,5 @@ class Num2Word_UK(object): if __name__ == '__main__': import doctest + doctest.testmod() diff --git a/num2words/orderedmapping.py b/num2words/orderedmapping.py index cf5b0c0..7481e7c 100644 --- a/num2words/orderedmapping.py +++ b/num2words/orderedmapping.py @@ -14,12 +14,13 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301 USA + class OrderedMapping(dict): def __init__(self, *pairs): self.order = [] for key, val in pairs: self[key] = val - + def __setitem__(self, key, val): if key not in self: self.order.append(key) @@ -30,6 +31,6 @@ class OrderedMapping(dict): yield item def __repr__(self): - out = ["%s: %s"%(repr(item), repr(self[item])) for item in self] + out = ["%s: %s" % (repr(item), repr(self[item])) for item in self] out = ", ".join(out) - return "{%s}"%out + return "{%s}" % out