Skip to content

Instantly share code, notes, and snippets.

@aleksas
Last active April 6, 2019 15:58
Show Gist options
  • Save aleksas/378037caddd78e2d9fe0d5fd4f975054 to your computer and use it in GitHub Desktop.
Save aleksas/378037caddd78e2d9fe0d5fd4f975054 to your computer and use it in GitHub Desktop.
Number conversion to textual representation
from json import load
class Number:
NAME = 0
TEN_POWER_NAME = 1
def get_number_name(value, number_filename, lang=None, form=None, ten_pow_system=None):
num_names = []
with open(number_filename, 'r', encoding='utf-8') as fp:
all_number_names = load(fp)
if not lang:
lang = all_number_names['Default']
if not form:
form = all_number_names[lang]['Default']
if not ten_pow_system:
ten_pow_system = all_number_names[lang][form]['Ten Power Names']['Default']
number_names = {int(k):v for k,v in all_number_names[lang][form]['Names'].items()}
ten_power_names = {int(k):v for k,v in all_number_names[lang][form]['Ten Power Names'][ten_pow_system].items()}
number_splits = get_number_splits(value, number_names.keys(), ten_power_names.keys())
for split in number_splits:
if split[1] == Number.NAME:
num_names.append(number_names[split[0]])
elif split[1] == Number.TEN_POWER_NAME:
num_names.append(ten_power_names[split[0]])
else:
raise Exception()
return num_names
def get_number_splits(value, number_name_keys, ten_powers_name_keys):
num_splits = []
if value == 0:
num_splits.append((0, Number.NAME))
else:
num_pow_splits = {}
for p in sorted(ten_powers_name_keys, reverse=True):
d = pow(10, p)
num_pow_splits[p] = value // d
value = value % d
for p in sorted(ten_powers_name_keys, reverse=True):
if num_pow_splits[p] == 0:
continue
if p == 1:
if num_pow_splits[p] == 1:
value = 10 + num_pow_splits[0]
num_splits.append((value, Number.NAME))
break
else:
value = num_pow_splits[p] * 10
num_splits.append((value, Number.NAME))
continue
if num_pow_splits[p] in number_name_keys:
num_splits.append((num_pow_splits[p], Number.NAME))
else:
num_splits += get_number_splits(num_pow_splits[p], number_name_keys, ten_powers_name_keys)
if p > 1:
num_splits.append((p, Number.TEN_POWER_NAME))
return num_splits
num_names = get_number_name(1001059900, 'number_names.json')
print (' '.join(num_names))
{
"Default": "EN",
"EN": {
"Default" : "Simple",
"Simple" : {
"Names" : {
"0":"zero", "1": "one", "2": "two", "3": "three", "4":"four", "5":"five",
"6":"six", "7":"seven", "8":"eight", "9":"nine", "10":"ten",
"11":"eleven", "12":"twelve", "13":"thirteen", "14":"fourteen", "15":"fifteen",
"16":"sixteen", "17":"seventeen", "18":"eighteen", "19":"nineteen",
"20": "twenty", "30": "thirty", "40": "fourty", "50": "fifty", "60": "sixty",
"70": "seventy", "80": "eighty", "90": "ninety"
},
"Ten Power Names": {
"Default": "Short System",
"Long system": {
"0": "one",
"1": "ten",
"2": "hundred",
"3": "thousand",
"6": "million",
"9": "milliard",
"12": "billion",
"18": "trillion",
"24": "quadrillion",
"30": "quintillion",
"36": "sextillion",
"42": "septillion",
"48": "octillion",
"54": "nonillion",
"60": "decillion",
"66": "undecillion",
"72": "duodecillion",
"78": "tredecillion",
"84": "quattuordecillion",
"90": "quindecillion",
"96": "sexdecillion",
"102": "septendecillion",
"108": "octodecillion",
"114": "novemdecillion",
"120": "vigintillion",
"600": "centillion"
},
"Short System": {
"0": "one",
"1": "ten",
"2": "hundred",
"3": "thousand",
"6": "million",
"9": "billion",
"12": "trillion",
"15": "quadrillion",
"18": "quintillion",
"21": "sextillion",
"24": "septillion",
"27": "octillion",
"30": "nonillion",
"33": "decillion",
"36": "undecillion",
"39": "duodecillion",
"42": "tredecillion",
"45": "quattuordecillion",
"48": "quindecillion",
"51": "sexdecillion",
"54": "septendecillion",
"57": "octodecillion",
"60": "novemdecillion",
"63": "vigintillion",
"303": "centillion"
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment