| PERSIAN_DIGITS = { | |
| '۰': 'صفر', '۱': 'یک', '۲': 'دو', '۳': 'سه', '۴': 'چهار', | |
| '۵': 'پنج', '۶': 'شش', '۷': 'هفت', '۸': 'هشت', '۹': 'نه', | |
| '0': 'صفر', '1': 'یک', '2': 'دو', '3': 'سه', '4': 'چهار', | |
| '5': 'پنج', '6': 'شش', '7': 'هفت', '8': 'هشت', '9': 'نه' | |
| } | |
| PERSIAN_NUMBERS = { | |
| 10: 'ده', 11: 'یازده', 12: 'دوازده', 13: 'سیزده', 14: 'چهارده', | |
| 15: 'پانزده', 16: 'شانزده', 17: 'هفده', 18: 'هجده', 19: 'نوزده', | |
| 20: 'بیست', 30: 'سی', 40: 'چهل', 50: 'پنجاه', | |
| 60: 'شصت', 70: 'هفتاد', 80: 'هشتاد', 90: 'نود', | |
| 100: 'صد', 200: 'دویست', 300: 'سیصد', 400: 'چهارصد', 500: 'پانصد', | |
| 600: 'ششصد', 700: 'هفتصد', 800: 'هشتصد', 900: 'نهصد' | |
| } | |
| def convert_three_digit(num: int) -> str: | |
| if num == 0: | |
| return '' | |
| if num < 10: | |
| return PERSIAN_DIGITS[str(num)] | |
| elif num < 20: | |
| return PERSIAN_NUMBERS[num] | |
| elif num < 100: | |
| tens = (num // 10) * 10 | |
| ones = num % 10 | |
| if ones == 0: | |
| return PERSIAN_NUMBERS[tens] | |
| return PERSIAN_NUMBERS[tens] + ' و ' + PERSIAN_DIGITS[str(ones)] | |
| else: | |
| hundreds = (num // 100) * 100 | |
| remainder = num % 100 | |
| if remainder == 0: | |
| return PERSIAN_NUMBERS[hundreds] | |
| return PERSIAN_NUMBERS[hundreds] + ' و ' + convert_three_digit(remainder) | |
| def convert_number_to_text(num_str: str, phone_mode: bool = False) -> str: | |
| try: | |
| num_str = num_str.replace(',', '').replace('٬', '').replace(' ', '') | |
| persian_to_english = str.maketrans('۰۱۲۳۴۵۶۷۸۹', '0123456789') | |
| num_str = num_str.translate(persian_to_english) | |
| if phone_mode: | |
| return ' '.join(PERSIAN_DIGITS[d] for d in num_str if d.isdigit()) | |
| num = int(num_str) | |
| if num == 0: | |
| return 'صفر' | |
| if num < 0: | |
| return 'منفی ' + convert_number_to_text(str(abs(num))) | |
| if num < 1000: | |
| return convert_three_digit(num) | |
| parts = [] | |
| if num >= 1_000_000_000: | |
| billions = num // 1_000_000_000 | |
| parts.append(convert_three_digit(billions) + ' میلیارد') | |
| num %= 1_000_000_000 | |
| if num >= 1_000_000: | |
| millions = num // 1_000_000 | |
| parts.append(convert_three_digit(millions) + ' میلیون') | |
| num %= 1_000_000 | |
| if num >= 1000: | |
| thousands = num // 1000 | |
| parts.append(convert_three_digit(thousands) + ' هزار') | |
| num %= 1000 | |
| if num > 0: | |
| parts.append(convert_three_digit(num)) | |
| return ' و '.join(parts) | |
| except: | |
| return num_str | |