Last active
April 6, 2019 15:58
-
-
Save aleksas/378037caddd78e2d9fe0d5fd4f975054 to your computer and use it in GitHub Desktop.
Number conversion to textual representation
This file contains hidden or 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
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)) |
This file contains hidden or 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
{ | |
"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