TTS / snfl_imdann.py
ayymen's picture
Add num2words
5536535
class TifinaghNumberConverter:
AND = " ⴷ "
UNITS = ["ⴰⵎⵢⴰ", "ⵢⴰⵏ", "ⵙⵉⵏ", "ⴽⵕⴰⴹ", "ⴽⴽⵓⵥ", "ⵙⵎⵎⵓⵙ", "ⵚⴹⵉⵚ", "ⵙⴰ", "ⵜⴰⵎ", "ⵜⵥⴰ"]
TENS = ["", "ⵎⵔⴰⵡ", "ⵙⵉⵎⵔⴰⵡ", "ⴽⵕⴰⵎⵔⴰⵡ", "ⴽⴽⵓⵎⵔⴰⵡ", "ⵙⵎⵎⵓⵎⵔⴰⵡ", "ⵚⴹⵉⵎⵔⴰⵡ", "ⵙⴰⵎⵔⴰⵡ", "ⵜⴰⵎⵔⴰⵡ", "ⵜⵥⴰⵎⵔⴰⵡ"]
HUNDREDS = ["", "ⵜⵉⵎⵉⴹⵉ", "ⵙⵏⴰⵜ ⵜⵎⴰⴹ", "ⴽⵕⴰⴹⵜ ⵜⵎⴰⴹ", "ⴽⴽⵓⵥⵜ ⵜⵎⴰⴹ", "ⵙⵎⵎⵓⵙⵜ ⵜⵎⴰⴹ", "ⵚⴹⵉⵚⵜ ⵜⵎⴰⴹ", "ⵙⴰⵜ ⵜⵎⴰⴹ", "ⵜⴰⵎⵜ ⵜⵎⴰⴹ", "ⵜⵥⴰⵜ ⵜⵎⴰⴹ"]
ORDERS = ["", "ⵉⴼⴹ", "ⴰⵎⵍⵢⵓⵏ", "ⴰⵎⵍⵢⴰⵕ", "ⴰⵜⵔⵉⵍⵢⵓⵏ", "ⴰⴽⵡⴰⴹⵕⵉⵍⵢⵓⵏ", "ⴰⴽⵡⵉⵏⵜⵔⵉⵍⵢⵓⵏ", "ⴰⵙⵉⴽⵙⵜⵉⵍⵢⵓⵏ", "ⴰⵙⵉⴱⵜⵉⵍⵢⵓⵏ", "ⴰⵡⴽⵜⵉⵍⵢⵓⵏ", "ⴰⵏⵓⵏⵉⵍⵢⵓⵏ"]
ORDERS_PLURAL = ["", "ⵡⴰⴼⴹⴰⵏ", "ⵉⴷ ⴰⵎⵍⵢⵓⵏ", "ⵉⴷ ⴰⵎⵍⵢⴰⵕ", "ⵉⵜⵔⵉⵍⵢⵓⵏⵏ", "ⵉⴽⵡⴰⴹⵕⵉⵍⵢⵓⵏⵏ", "ⵉⴽⵡⵉⵏⵜⵔⵉⵍⵢⵓⵏⵏ", "ⵉⵙⵉⴽⵙⵜⵉⵍⵢⵓⵏⵏ", "ⵉⵙⵉⴱⵜⵉⵍⵢⵓⵏⵏ", "ⵉⵡⴽⵜⵉⵍⵢⵓⵏⵏ", "ⵉⵏⵓⵏⵉⵍⵢⵓⵏⵏ"]
@classmethod
def convert_number_to_999(cls, n):
"""Convert numbers from 0 to 999 to Tifinagh."""
if n == 0:
return ""
if n < 10:
return cls.UNITS[n]
if n < 20:
if n % 10 == 0:
return cls.TENS[n // 10]
return cls.UNITS[n % 10] + cls.AND + cls.TENS[n // 10]
if n < 100:
if n % 10 == 0:
return cls.TENS[n // 10]
return cls.TENS[n // 10] + cls.AND + cls.UNITS[n % 10]
if n < 1000:
if n % 100 == 0:
return cls.HUNDREDS[n // 100]
return cls.HUNDREDS[n // 100] + cls.AND + cls.convert_number_to_999(n % 100)
return ""
@classmethod
def convert_large_number(cls, n):
"""Convert large numbers to Tifinagh."""
if n < 1000:
return cls.convert_number_to_999(n)
for order in range(len(cls.ORDERS) - 1, 0, -1):
order_value = 10 ** (order * 3)
if n >= order_value:
quotient = n // order_value
remainder = n % order_value
if quotient == 1:
if remainder:
return cls.ORDERS[order] + cls.AND + cls.convert_large_number(remainder)
return cls.ORDERS[order]
else:
if remainder:
return cls.convert_number_to_999(quotient) + " " + \
cls.ORDERS_PLURAL[order] + cls.AND + cls.convert_large_number(remainder)
return cls.convert_number_to_999(quotient) + " " + cls.ORDERS_PLURAL[order]
return ""
@classmethod
def convert(cls, number):
"""Main conversion method."""
if number == 0:
return "ⴰⵎⵢⴰ"
if number < 0:
return "- " + cls.convert_large_number(abs(number))
return cls.convert_large_number(number)