diff --git a/num2words/lang_DK.py b/num2words/lang_DK.py index 7d30732..551611d 100644 --- a/num2words/lang_DK.py +++ b/num2words/lang_DK.py @@ -21,8 +21,8 @@ class Num2Word_DK(lang_EU.Num2Word_EU): def set_high_numwords(self, 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 + "illarder" + self.cards[10**(n-3)] = word + "illioner" def setup(self): self.negword = "minus " @@ -53,101 +53,57 @@ class Num2Word_DK(lang_EU.Num2Word_EU): "tolv" : "tolvte", "tyve" : "tyvende" } + def merge(self, curr, next): + ctext, cnum, ntext, nnum = curr + next + + if cnum == 1: + if nnum < 10**6 or self.ordflag: + return next + ctext = "en" + + if nnum > cnum: + if nnum >= 10**6: + ctext += " " + val = cnum * nnum + else: + if nnum < 10 < cnum < 100: + if nnum == 1: + ntext = "en" + ntext, ctext = ctext, ntext + "og" + elif cnum >= 10**6: + ctext += " " + val = cnum + nnum + + word = ctext + ntext + return (word, val) - def merge(self, (ltext, lnum), (rtext, rnum)): - if lnum == 1 and rnum < 100: - return (rtext, rnum) - elif 100 > lnum > rnum : - return ("%s-%s"%(ltext, rtext), lnum + rnum) - elif lnum >= 100 > 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) - #TODO: skal returnere ordnum is 21ende, og ord is tyvende def to_ordinal(self, value): self.verify_ordinal(value) - outwords = self.to_cardinal(value).split(" ") - lastwords = outwords[-1].split("-") - lastword = lastwords[-1].lower() - try: - lastword = self.ords[lastword] - except KeyError: - if lastword[-2:] == "ti": - lastword = lastword + "ende" - else: - lastword += "de" - lastwords[-1] = self.title(lastword) - outwords[-1] = "".join(lastwords) - return " ".join(outwords) - - #TODO:Skal returnere "en" istedet for "et" i 21. - def to_splitnum(self, val, hightxt="", lowtxt="", jointxt="", - divisor=100, longval=True, cents = True): - out = [] - try: - high, low = val - except TypeError: - high, low = divmod(val, divisor) - if high: - hightxt = self.title(self.inflect(high, hightxt)) - out.append(self.to_cardinal(high)) - if low: - if longval: - if hightxt: - out.append(hightxt) - if jointxt: - out.append(self.title(jointxt)) - elif hightxt: - out.append(hightxt) - if low: - if cents: - out.append(self.to_cardinal(low)) - else: - out.append("%02d" % low) - if lowtxt and longval: - out.append(self.title(self.inflect(low, lowtxt))) - return " ".join(out) - - #TODO: 21 skal returnere enogtyve i card. - def to_cardinal(self, value): - try: - assert long(value) == value - except (ValueError, TypeError, AssertionError): - return self.to_cardinal_float(value) - - self.verify_num(value) - - out = "" - if value < 0: - value = abs(value) - out = self.negword - - if value >= self.MAXVAL: - raise OverflowError(self.errmsg_toobig % (value, self.MAXVAL)) - - - val = self.splitnum(value) - words, num = self.clean(val) - return self.title(out + words) + self.ordflag = True + outword = self.to_cardinal(value) + self.ordflag = False + for key in self.ords: + if outword.endswith(key): + outword = outword[:len(outword) - len(key)] + self.ords[key] + break + return outword + "te" + # Is this correct?? def to_ordinal_num(self, value): self.verify_ordinal(value) - return "%s%s"%(value, self.to_ordinal(value)[-2:]) + return str(value) + "te" + def to_currency(self, val, longval=True): + return self.to_splitnum(val, hightxt="kr", lowtxt="\xf8re", + jointxt="og",longval=longval) + def to_year(self, val, longval=True): if not (val//100)%10: return self.to_cardinal(val) - return self.to_splitnum(val, hightxt="hundrede", 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) - + return self.to_splitnum(val, hightxt="hundrede og", longval=longval) n2w = Num2Word_DK() to_card = n2w.to_cardinal @@ -156,16 +112,15 @@ to_ordnum = n2w.to_ordinal_num to_year = n2w.to_year def main(): - n2w.test(21) - # 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, "er", n2w.to_currency(val) - # print val, "er", n2w.to_year(val) + 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, "er", n2w.to_currency(val) + print val, "er", n2w.to_year(val) if __name__ == "__main__":