| import os
|
| import csv
|
|
|
| class NumberDictionary:
|
| def __init__(self):
|
| directoryPath = "numToText"
|
|
|
| languages = self.get_filenames_in_folder(directoryPath)
|
|
|
| self.lang_num_dictionary = self.load_language_dictionary(directoryPath, languages)
|
|
|
|
|
|
|
|
|
| def get_filenames_in_folder(self,folder_path):
|
| file_list = []
|
|
|
|
|
| for filename in os.listdir(folder_path):
|
|
|
| if os.path.isfile(os.path.join(folder_path, filename)):
|
| file_list.append(filename[:-4])
|
|
|
| return file_list
|
|
|
|
|
| def load_language_dictionary(self, directory_path, file_names):
|
| lang_num_dictionary = {}
|
|
|
| for file_name in file_names:
|
| language = os.path.splitext(file_name)[0]
|
| file_path = os.path.join(directory_path, f"{file_name}.csv")
|
| if not os.path.exists(file_path):
|
|
|
| continue
|
|
|
| with open(file_path, 'r', encoding='utf-8') as file:
|
| reader = csv.reader(file)
|
| language_map = {row[0].strip(): row[1].strip() for row in reader}
|
|
|
| lang_num_dictionary[language] = language_map
|
|
|
| return lang_num_dictionary
|
|
|
| def num2text(self, input_str, language):
|
| if language not in self.lang_num_dictionary:
|
| return "Language not supported."
|
|
|
| integer_part, *decimal_part = input_str.split('.')
|
| try:
|
| int_part = int(integer_part)
|
| except ValueError:
|
| return "Invalid input. Please provide a valid number."
|
|
|
| if int_part < 0 or int_part > 999999999999999:
|
| return "Number out of range (0-999999999999999)"
|
|
|
| lang_map = self.lang_num_dictionary[language]
|
| integer_text = self.convert_to_indian_number(int_part, lang_map)
|
|
|
| if decimal_part:
|
| decimal_text = lang_map.get('.', '') + ' '
|
| for digit in decimal_part[0]:
|
| decimal_text += lang_map.get(digit, '') + ' '
|
| return (integer_text + ' ' + decimal_text).strip()
|
| else:
|
| return integer_text.strip()
|
|
|
| def convert_to_indian_number(self, n, lang_map):
|
| numeric_keys = [key for key in lang_map.keys() if key.isdigit()]
|
| if n <= 20 or (n <= 100 and str(n) in lang_map):
|
| return lang_map.get(str(n), '')
|
| elif n < 1000:
|
| result = f"{lang_map.get(str(n // 100), '')} {lang_map.get('100', '')}"
|
| if n % 100 != 0:
|
| result += f" {self.convert_to_indian_number(n % 100, lang_map)}"
|
| return result.strip()
|
| else:
|
| base, term = 0, ''
|
| for key in sorted(numeric_keys, key=int, reverse=True):
|
| if n >= int(key):
|
| base = int(key)
|
| term = lang_map[key]
|
| break
|
|
|
| if n % base == 0:
|
| return f"{self.convert_to_indian_number(n // base, lang_map)} {term}"
|
| else:
|
| return f"{self.convert_to_indian_number(n // base, lang_map)} {term} {self.convert_to_indian_number(n % base, lang_map)}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|