CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-num2words

Modules to convert numbers to words in multiple languages with support for 50+ locales.

Pending
Overview
Eval results
Files

language-support.mddocs/

Language Support

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.

Capabilities

Available Languages

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)

Language Code Reference

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'    # Tetum

Language Detection and Fallback

Intelligent 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 implementation

Language-Specific Features

Different 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 representation

Ordinal 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")

Conversion Type Support

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')

Currency Support by Language

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)

Language Converter Classes

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 classes

Regional Variant Classes

Some 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)

Adding New Languages

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
        pass

Error Handling

Language-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

docs

base-converter.md

currency-conversion.md

index.md

language-support.md

number-conversion.md

utility-functions.md

tile.json