Modules to convert numbers to words in multiple languages with support for 50+ locales.
—
The num2words library provides comprehensive support for 50+ languages with both base language implementations and regional variants. Each language is implemented as a specialized converter class with culturally appropriate number formatting rules.
Access to all supported language codes through the global CONVERTER_CLASSES dictionary.
CONVERTER_CLASSES: dict
# Dictionary mapping language codes to converter instances
# Keys: Language codes (str)
# Values: Language-specific converter instances (Num2Word_Base subclasses)Usage Examples:
from num2words import CONVERTER_CLASSES
# Get all supported languages
supported_languages = list(CONVERTER_CLASSES.keys())
print(f"Supported languages: {len(supported_languages)}")
# Check if a language is supported
if 'fr' in CONVERTER_CLASSES:
print("French is supported")
# Access a specific converter
english_converter = CONVERTER_CLASSES['en']
result = english_converter.to_cardinal(42)Complete list of supported language codes with their descriptions:
# European Languages
'en' # English (base)
'en_IN' # English (India)
'en_NG' # English (Nigeria)
'fr' # French (base)
'fr_BE' # French (Belgium)
'fr_CH' # French (Switzerland)
'fr_DZ' # French (Algeria)
'es' # Spanish (base)
'es_CO' # Spanish (Colombia)
'es_CR' # Spanish (Costa Rica)
'es_GT' # Spanish (Guatemala)
'es_NI' # Spanish (Nicaragua)
'es_VE' # Spanish (Venezuela)
'de' # German
'it' # Italian
'pt' # Portuguese (base)
'pt_BR' # Portuguese (Brazil)
'nl' # Dutch
'sv' # Swedish
'no' # Norwegian
'da' # Danish
'fi' # Finnish
'is' # Icelandic
# Slavic Languages
'ru' # Russian
'pl' # Polish
'cs' # Czech
'sk' # Slovak
'sl' # Slovene
'sr' # Serbian
'uk' # Ukrainian
'be' # Belarusian
'lt' # Lithuanian
'lv' # Latvian
# Other European
'hu' # Hungarian
'ro' # Romanian
'cy' # Welsh
'eo' # Esperanto
# Middle Eastern & Central Asian
'ar' # Arabic
'fa' # Farsi (Persian)
'he' # Hebrew
'tr' # Turkish
'kz' # Kazakh
'tg' # Tajik
'am' # Amharic
'az' # Azerbaijani
'ce' # Chechen
# Asian Languages
'ja' # Japanese
'ko' # Korean
'th' # Thai
'vi' # Vietnamese
'id' # Indonesian
'bn' # Bangladeshi
'kn' # Kannada
'te' # Telugu
# Other Languages
'ca' # Catalonian
'tet' # TetumIntelligent language code processing with fallback mechanisms.
def get_converter(lang_code: str):
"""
Get converter for language code with fallback logic.
Process:
1. Try full language code (e.g., 'en_US')
2. Fall back to base language (e.g., 'en')
3. Raise NotImplementedError if not found
Parameters:
- lang_code: str - Language code to lookup
Returns:
Num2Word_Base - Language converter instance
Raises:
NotImplementedError - If language not supported
"""Usage Examples:
from num2words import num2words
# Regional variants with fallback
num2words(42, lang='en_US') # Falls back to 'en'
num2words(42, lang='fr_FR') # Falls back to 'fr'
num2words(42, lang='es_MX') # Falls back to 'es'
# Specific regional implementations
num2words(42, lang='en_IN') # Uses Indian English formatting
num2words(42, lang='fr_BE') # Uses Belgian French formatting
num2words(42, lang='pt_BR') # Uses Brazilian Portuguese formatting
# Case sensitivity handling
num2words(42, lang='EN') # Typically case-insensitive
num2words(42, lang='Fr') # Depends on implementationDifferent languages support different conversion types and have unique formatting rules.
Cardinal Number Variations:
# English: Standard grouping with "and"
num2words(1234, lang='en') # "one thousand, two hundred and thirty-four"
# French: Unique rules for 70, 80, 90
num2words(71, lang='fr') # "soixante et onze"
num2words(80, lang='fr') # "quatre-vingts"
num2words(99, lang='fr') # "quatre-vingt-dix-neuf"
# German: Compound number formation
num2words(21, lang='de') # "einundzwanzig" (one-and-twenty)
# Arabic: Right-to-left script support
num2words(42, lang='ar') # Arabic script output
# Japanese: Multiple number systems
num2words(42, lang='ja') # Can use different counting systems
# Vietnamese: Southeast Asian formatting
num2words(42, lang='vi') # Vietnamese representationOrdinal Number Support:
# English ordinals
num2words(21, to='ordinal', lang='en') # "twenty-first"
# French ordinals
num2words(21, to='ordinal', lang='fr') # "vingt et unième"
# Spanish ordinals
num2words(21, to='ordinal', lang='es') # "vigésimo primero"
# Note: Not all languages support all conversion types
try:
num2words(21, to='ordinal', lang='ja')
except NotImplementedError:
print("Ordinals not implemented for Japanese")Different languages may support different conversion types.
CONVERTES_TYPES: list
# Available conversion types across all languages
# ['cardinal', 'ordinal', 'ordinal_num', 'year', 'currency']
def get_languages():
"""
Get sorted list of available language codes.
Returns:
list: Sorted list of all supported language codes
"""
def get_converters():
"""
Get sorted list of available conversion types.
Returns:
list: Sorted list of all supported conversion types
"""Language-Specific Support Matrix:
from num2words import num2words, CONVERTES_TYPES
def test_language_support(lang, number=42):
"""Test which conversion types are supported for a language."""
supported = {}
for conv_type in CONVERTES_TYPES:
try:
result = num2words(number, lang=lang, to=conv_type)
supported[conv_type] = result
except NotImplementedError:
supported[conv_type] = "Not supported"
return supported
# Test English (typically supports all types)
en_support = test_language_support('en')
# Test other languages
fr_support = test_language_support('fr')
ja_support = test_language_support('ja')
ar_support = test_language_support('ar')Different languages have different currency format implementations.
# Euro in different languages
num2words(42.50, to='currency', lang='en', currency='EUR')
# "forty-two euros, fifty cents"
num2words(42.50, to='currency', lang='fr', currency='EUR')
# "quarante-deux euros, cinquante centimes"
num2words(42.50, to='currency', lang='de', currency='EUR')
# German currency formatting
# Different currencies
num2words(42.50, to='currency', lang='en', currency='USD')
# "forty-two dollars, fifty cents"
num2words(42.50, to='currency', lang='ja', currency='JPY')
# Japanese yen formatting (if supported)Each language is implemented as a class inheriting from Num2Word_Base.
# Example language converter classes
class Num2Word_EN(Num2Word_Base): ... # English
class Num2Word_FR(Num2Word_Base): ... # French
class Num2Word_ES(Num2Word_Base): ... # Spanish
class Num2Word_DE(Num2Word_Base): ... # German
class Num2Word_JA(Num2Word_Base): ... # Japanese
class Num2Word_AR(Num2Word_Base): ... # Arabic
# ... and 44+ more language classesSome languages have specific regional implementations.
# Regional English variants
class Num2Word_EN_IN(Num2Word_EN): ... # English (India)
class Num2Word_EN_NG(Num2Word_EN): ... # English (Nigeria)
# Regional French variants
class Num2Word_FR_BE(Num2Word_FR): ... # French (Belgium)
class Num2Word_FR_CH(Num2Word_FR): ... # French (Switzerland)
class Num2Word_FR_DZ(Num2Word_FR): ... # French (Algeria)
# Regional Spanish variants
class Num2Word_ES_CO(Num2Word_ES): ... # Spanish (Colombia)
class Num2Word_ES_CR(Num2Word_ES): ... # Spanish (Costa Rica)
class Num2Word_ES_GT(Num2Word_ES): ... # Spanish (Guatemala)
class Num2Word_ES_NI(Num2Word_ES): ... # Spanish (Nicaragua)
class Num2Word_ES_VE(Num2Word_ES): ... # Spanish (Venezuela)
# Regional Portuguese variants
class Num2Word_PT_BR(Num2Word_PT): ... # Portuguese (Brazil)The architecture supports adding new languages by creating converter classes.
# Example template for new language implementation
class Num2Word_NewLang(Num2Word_Base):
def setup(self):
# Language-specific setup
self.negword = "negative " # How to represent negative numbers
self.pointword = "point" # How to represent decimal point
# Define number words
self.low_numwords = ["zero", "one", "two", ...] # 0-19
self.mid_numwords = [(20, "twenty"), (30, "thirty"), ...] # Tens
self.high_numwords = ["thousand", "million", ...] # Large numbers
def pluralize(self, n, forms):
# Language-specific pluralization rules
pass
def to_ordinal(self, value):
# Language-specific ordinal conversion
passLanguage-related error scenarios and their handling:
# Unsupported language
try:
num2words(42, lang='unsupported_lang')
except NotImplementedError as e:
print(f"Language not supported: {e}")
# Unsupported conversion type for language
try:
num2words(42, to='unsupported_type')
except NotImplementedError as e:
print(f"Conversion type not supported: {e}")
# Regional variant fallback
result = num2words(42, lang='en_NonExistent') # Falls back to 'en'Install with Tessl CLI
npx tessl i tessl/pypi-num2words