-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
31 changed files
with
22,424 additions
and
55 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
''' | ||
Module: num2word.py | ||
Requires: num2word_*.py | ||
Version: 0.2 | ||
Author: | ||
Taro Ogawa ([email protected]) | ||
Copyright: | ||
Copyright (c) 2003, Taro Ogawa. All Rights Reserved. | ||
Licence: | ||
This module is distributed under the Lesser General Public Licence. | ||
http://www.opensource.org/licenses/lgpl-license.php | ||
Usage: | ||
from num2word import to_card, to_ord, to_ordnum | ||
to_card(1234567890) | ||
to_ord(1234567890) | ||
to_ordnum(12) | ||
Notes: | ||
The module is a wrapper for language-specific modules. It imports the | ||
appropriate modules as defined by locale settings. If unable to | ||
load an appropriate module, an ImportError is raised. | ||
History: | ||
0.2: n2w, to_card, to_ord, to_ordnum now imported correctly | ||
''' | ||
import locale as _locale | ||
|
||
# Correct omissions in locale: | ||
# Bugrep these... | ||
_locdict = { "English_Australia" : "en_AU", } | ||
|
||
|
||
_modules = [] | ||
for _loc in [_locale.getlocale(), _locale.getdefaultlocale()]: | ||
_lang = _loc[0] | ||
if _lang: | ||
_lang = _locdict.get(_lang, _lang) | ||
_lang = _lang.upper() | ||
|
||
_modules.append("num2word_" + _lang) | ||
_modules.append("num2word_" + _lang.split("_")[0]) | ||
|
||
for _module in _modules: | ||
try: | ||
n2wmod = __import__(_module) | ||
break | ||
except ImportError: | ||
pass | ||
|
||
try: | ||
n2w, to_card, to_ord, to_ordnum, to_year = (n2wmod.n2w, n2wmod.to_card, | ||
n2wmod.to_ord, n2wmod.to_ordnum, | ||
n2wmod.to_year) | ||
except NameError: | ||
raise ImportError("Could not import any of these modules: %s" | ||
% (", ".join(_modules))) |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
''' | ||
Module: num2word_DE.py | ||
Requires: num2word_base.py | ||
Version: 0.4 | ||
Author: | ||
Taro Ogawa ([email protected]) | ||
Copyright: | ||
Copyright (c) 2003, Taro Ogawa. All Rights Reserved. | ||
Licence: | ||
This module is distributed under the Lesser General Public Licence. | ||
http://www.opensource.org/licenses/lgpl-license.php | ||
Data from: | ||
- http://german4u2know.tripod.com/nouns/10.html | ||
- http://www.uni-bonn.de/~manfear/large.php | ||
Usage: | ||
from num2word_DE import to_card, to_ord, to_ordnum | ||
to_card(1234567890) | ||
to_ord(1234567890) | ||
to_ordnum(12) | ||
History | ||
0.4: Use high ascii characters instead of low ascii approximations | ||
add to_currency() and to_year() | ||
''' | ||
from num2word_EU import Num2Word_EU | ||
|
||
#//TODO: Use German error messages | ||
class Num2Word_DE(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 + "illiarde" | ||
self.cards[10**(n-3)] = word + "illion" | ||
|
||
|
||
def setup(self): | ||
self.negword = "minus " | ||
self.pointword = "Komma" | ||
self.errmsg_nonnum = "Only numbers may be converted to words." | ||
self.errmsg_toobig = "Number is too large to convert to words." | ||
self.exclude_title = [] | ||
|
||
lows = ["non", "okt", "sept", "sext", "quint", "quadr", "tr", "b", "m"] | ||
units = ["", "un", "duo", "tre", "quattuor", "quin", "sex", "sept", | ||
"okto", "novem"] | ||
tens = ["dez", "vigint", "trigint", "quadragint", "quinquagint", | ||
"sexagint", "septuagint", "oktogint", "nonagint"] | ||
self.high_numwords = ["zent"]+self.gen_high_numwords(units, tens, lows) | ||
self.mid_numwords = [(1000, "tausand"), (100, "hundert"), | ||
(90, "neunzig"), (80, "achtzig"), (70, "siebzig"), | ||
(60, "sechzig"), (50, "f\xFCnfzig"), (40, "vierzig"), | ||
(30, "drei\xDFig")] | ||
self.low_numwords = ["zwanzig", "neunzehn", "achtzen", "siebzehn", | ||
"sechzehn", "f\xFCnfzehn", "vierzehn", "dreizehn", | ||
"zw\xF6lf", "elf", "zehn", "neun", "acht", "sieben", | ||
"sechs", "f\xFCnf", "vier", "drei", "zwei", "eins", | ||
"null"] | ||
self.ords = { "eins" : "ers", | ||
"drei" : "drit", | ||
"acht" : "ach", | ||
"sieben" : "sieb", | ||
"ig" : "igs" } | ||
self.ordflag = False | ||
|
||
|
||
def merge(self, curr, next): | ||
ctext, cnum, ntext, nnum = curr + next | ||
|
||
if cnum == 1: | ||
if nnum < 10**6 or self.ordflag: | ||
return next | ||
ctext = "eine" | ||
|
||
if nnum > cnum: | ||
if nnum >= 10**6: | ||
if cnum > 1: | ||
if ntext.endswith("e") or self.ordflag: | ||
ntext += "s" | ||
else: | ||
ntext += "es" | ||
ctext += " " | ||
val = cnum * nnum | ||
else: | ||
if nnum < 10 < cnum < 100: | ||
if nnum == 1: | ||
ntext = "ein" | ||
ntext, ctext = ctext, ntext + "und" | ||
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 | ||
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 str(value) + "te" | ||
|
||
|
||
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) | ||
return super(Num2Word_DE, self).to_currency(val, jointxt="und", | ||
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="hundert", longval=longval) | ||
|
||
|
||
|
||
n2w = Num2Word_DE() | ||
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]: | ||
n2w.test(val) | ||
|
||
n2w.test(1325325436067876801768700107601001012212132143210473207540327057320957032975032975093275093275093270957329057320975093272950730) | ||
print n2w.to_currency(112121) | ||
print n2w.to_year(2000) | ||
|
||
if __name__ == "__main__": | ||
main() | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
''' | ||
Module: num2word_EN.py | ||
Requires: num2word_EU.py | ||
Version: 1.2 | ||
Author: | ||
Taro Ogawa ([email protected]) | ||
Copyright: | ||
Copyright (c) 2003, Taro Ogawa. All Rights Reserved. | ||
Licence: | ||
This module is distributed under the Lesser General Public Licence. | ||
http://www.opensource.org/licenses/lgpl-license.php | ||
Data from: | ||
http://www.uni-bonn.de/~manfear/large.php | ||
Usage: | ||
from num2word_EN import n2w, to_card, to_ord, to_ordnum | ||
to_card(1234567890) | ||
n2w.is_title = True | ||
to_card(1234567890) | ||
to_ord(1234567890) | ||
to_ordnum(1234567890) | ||
to_year(1976) | ||
to_currency(dollars*100 + cents, longval=False) | ||
to_currency((dollars, cents)) | ||
History: | ||
1.2: to_ordinal_num() made shorter and simpler (but slower) | ||
strings in merge() now interpolated | ||
to_year() and to_currency() added | ||
1.1: to_ordinal_num() fixed for 11,12,13 | ||
''' | ||
from __future__ import division | ||
import num2word_EU | ||
|
||
|
||
class Num2Word_EN(num2word_EU.Num2Word_EU): | ||
def set_high_numwords(self, high): | ||
max = 3 + 3*len(high) | ||
for word, n in zip(high, range(max, 3, -3)): | ||
self.cards[10**n] = word + "illion" | ||
|
||
def setup(self): | ||
self.negword = "minus " | ||
self.pointword = "point" | ||
self.errmsg_nonnum = "Only numbers may be converted to words." | ||
self.exclude_title = ["and", "point", "minus"] | ||
|
||
self.mid_numwords = [(1000, "thousand"), (100, "hundred"), | ||
(90, "ninety"), (80, "eighty"), (70, "seventy"), | ||
(60, "sixty"), (50, "fifty"), (40, "forty"), | ||
(30, "thirty")] | ||
self.low_numwords = ["twenty", "nineteen", "eighteen", "seventeen", | ||
"sixteen", "fifteen", "fourteen", "thirteen", | ||
"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" } | ||
|
||
|
||
def merge(self, curr, next): | ||
ctext, cnum, ntext, nnum = curr + next | ||
|
||
if cnum == 1 and nnum < 100: | ||
return next | ||
elif 100 > cnum > nnum : | ||
return ("%s-%s"%(ctext, ntext), cnum + nnum) | ||
elif cnum >= 100 > nnum: | ||
return ("%s and %s"%(ctext, ntext), cnum + nnum) | ||
elif nnum > cnum: | ||
return ("%s %s"%(ctext, ntext), cnum * nnum) | ||
return ("%s, %s"%(ctext, ntext), cnum + nnum) | ||
|
||
|
||
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[-1] == "y": | ||
lastword = lastword[:-1] + "ie" | ||
lastword += "th" | ||
lastwords[-1] = self.title(lastword) | ||
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:]) | ||
|
||
|
||
def to_year(self, val, longval=True): | ||
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) | ||
|
||
|
||
n2w = Num2Word_EN() | ||
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]: | ||
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) | ||
|
||
|
||
if __name__ == "__main__": | ||
main() |
Binary file not shown.
Oops, something went wrong.