# MarkusShepherd/literumi

Fetching contributors…
Cannot retrieve contributors at this time
108 lines (87 sloc) 2.51 KB
 # -*- coding: utf-8 -*- '''spells out numbers in Esperanto''' from __future__ import absolute_import, division, print_function, unicode_literals import sys NUMBERS = { 0: 'nulo', 1: 'unu', 2: 'du', 3: 'tri', 4: 'kvar', 5: 'kvin', 6: 'ses', 7: 'sep', 8: 'ok', 9: 'naŭ', 10: 'dek', 100: 'cent', 1000: 'mil', } FRAGMENTS = [ 'mil', 'bil', 'tril', 'kvadril', 'kvintil', 'sekstil', 'septil', 'oktil', 'nonil', 'dekil' ] def _init(): '''initialisations''' for i, fragment in enumerate(FRAGMENTS): exp = (i + 1) * 6 NUMBERS[10**exp] = fragment + 'iono' exp += 3 NUMBERS[10**exp] = fragment + 'iardo' _init() def spell(number, ordinal=False, max_decimals=10): '''spell out a number in Esperanto''' if number < 0: return 'minus ' + spell(-number) if ordinal: result = spell(number, ordinal=False) return result.replace(' ', '') + 'a' try: is_float = not number.is_integer() except AttributeError: is_float = False if is_float: integer, fraction = str(number).split('.') result = spell(int(integer)) + ' koma' for i, digit in enumerate(fraction[:max_decimals]): result += ' ' + NUMBERS[int(digit)] if all(d == '0' for d in fraction[i+1:max_decimals]): break return result result = NUMBERS.get(number) if result: return result for pos in (100, 1000): if number < pos: high, low = divmod(number, pos // 10) result = NUMBERS[pos // 10] if low: result += ' ' + spell(low) if high > 1: result = NUMBERS[high] + result return result exp = 3 high, low = divmod(number, 1000) result = spell(low) if low else '' while high: high, low = divmod(high, 1000) if low: part = NUMBERS[10**exp] if low > 1: part = spell(low) + ' ' + part if part.endswith('o'): part += 'j' result = part + ' ' + result if result else part exp += 3 return result def main(): '''main function for testing''' for arg in sys.argv[1:]: if '.' in arg: number_f = float(arg) print('{:13f} {}'.format(number_f, spell(number_f))) else: number_i = int(arg) print('{:13d} {}'.format(number_i, spell(number_i))) if __name__ == '__main__': main()