44def to_word (number : int , num_type : str = "lat" ) -> str :
55 """
66 Convert an integer to its text representation in either Latin or Cyrillic script.
7-
7+
88 Args:
99 number: The integer to convert
1010 num_type: The type of script to use, either "lat" or "cyr"
11-
11+
1212 Returns:
1313 The textual representation of the integer
14-
14+
1515 Raises:
1616 NumberRangeError: If the input is not an integer or exceeds the maximum supported number (nonillion)
1717 """
@@ -23,6 +23,7 @@ def to_word(number: int, num_type: str = "lat") -> str:
2323 _KEY_TENS = 'tens'
2424 _KEY_HUNDRED = 'hundred'
2525 _KEY_THOUSANDS = 'thousands'
26+ _KEY_MINUS_SIGN = 'minus'
2627
2728 _locale = {
2829 _NUM_TYPE_LAT : {
@@ -31,32 +32,38 @@ def to_word(number: int, num_type: str = "lat") -> str:
3132 _KEY_TENS : ['on' , 'jigirma' , 'otız' , 'qırıq' , 'eliw' , 'alpıs' , 'jetpis' , 'seksen' , 'toqsan' ],
3233 _KEY_THOUSANDS : ['' , 'mıń' , 'million' , 'milliard' , 'trillion' , 'kvadrillion' , 'kvintillion' , 'sekstilion' , 'septillion' , 'oktillion' , 'nonillion' ],
3334 _KEY_HUNDRED : 'júz' ,
35+ _KEY_MINUS_SIGN : 'minus' ,
3436 },
3537 _NUM_TYPE_CYR : {
3638 _KEY_ONES : ['ноль' , 'бир' , 'еки' , 'үш' , 'төрт' , 'бес' , 'алты' , 'жети' , 'сегиз' , 'тоғыз' ],
3739 _KEY_TEENS : ['он бир' , 'он еки' , 'он үш' , 'он төрт' , 'он бес' , 'он алты' , 'он жети' , 'он сегиз' , 'он тоғыз' ],
3840 _KEY_TENS : ['он' , 'жигирма' , 'отыз' , 'қырық' , 'елиў' , 'алпыс' , 'жетпис' , 'сексен' , 'тоқсан' ],
3941 _KEY_THOUSANDS : ['' , 'мың' , 'миллион' , 'миллиард' , 'триллион' , 'квадриллион' , 'квинтиллион' , 'секстиллион' , 'септиллион' , 'октиллион' , 'нониллион' ],
4042 _KEY_HUNDRED : 'жүз' ,
43+ _KEY_MINUS_SIGN : 'минус' ,
4144 }
4245 }
43-
46+
4447 if num_type not in ['lat' , 'cyr' ]:
4548 raise KeyError ("Invalid num_type" )
46-
49+
4750 if not isinstance (number , int ):
4851 raise TypeError ("Input must be an integer" )
49-
52+
53+ is_negative = number < 0
54+ number = abs (number )
55+
5056 # Check if number exceeds nonillion (10^30)
51- if abs ( number ) > 10 ** 30 :
57+ if number > 10 ** 30 :
5258 raise NumberRangeError ("Number exceeded limit" )
53-
59+
5460 current_locale = _locale [_NUM_TYPE_CYR ] if num_type == _NUM_TYPE_CYR else _locale [_NUM_TYPE_LAT ]
55-
61+
5662 ones = current_locale [_KEY_ONES ]
5763 teens = current_locale [_KEY_TEENS ]
5864 tens = current_locale [_KEY_TENS ]
5965 thousands = current_locale [_KEY_THOUSANDS ]
66+ minus_sign = current_locale [_KEY_MINUS_SIGN ]
6067
6168 def convert_hundreds (num ):
6269 if num < 10 :
@@ -72,9 +79,9 @@ def convert_number(num):
7279 if num == 0 :
7380 return ones [num ]
7481 if num == 100 :
75- return current_locale [_KEY_HUNDRED ]
82+ return minus_sign + ' ' + current_locale [ _KEY_HUNDRED ] if is_negative else current_locale [_KEY_HUNDRED ]
7683 if num == 1000 :
77- return thousands [1 ]
84+ return minus_sign + ' ' + thousands [ 1 ] if is_negative else thousands [1 ]
7885
7986 parts = []
8087 i = 0
@@ -83,6 +90,8 @@ def convert_number(num):
8390 parts .append (convert_hundreds (num % 1000 ) + (" " + thousands [i ] if thousands [i ] else "" ))
8491 num //= 1000
8592 i += 1
93+ if is_negative :
94+ parts .append (minus_sign )
8695 return " " .join (reversed (parts ))
8796
8897 return convert_number (number )
0 commit comments