Skip to content

Commit 4ab6df8

Browse files
committed
fix: added prefix word minus for negative numbers
1 parent 1e2bb70 commit 4ab6df8

1 file changed

Lines changed: 20 additions & 11 deletions

File tree

kaalin/number/num2words.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
def 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

Comments
 (0)