Numeral Systems

Multilingual numeral support — Unicode scripts, Roman numerals, complex numbers, fractions.

multilingual provides first-class support for numerals in multiple scripts and representations.


MPNumeral

Base multilingual numeral class. Supports arithmetic across numeral scripts.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from multilingualprogramming import MPNumeral

# Create from integer
n1 = MPNumeral(42)

# Create from Arabic-Indic digits
n2 = MPNumeral("٤٢")

# Create from Devanagari digits
n3 = MPNumeral("४२")

# Create from CJK numerals
n4 = MPNumeral("四十二")

# Arithmetic (all return MPNumeral)
result = n1 + n2
result = n1 * MPNumeral(3)
result = n1 - MPNumeral(10)
result = n1 / MPNumeral(6)

# Conversion
print(n1.to_int())              # 42
print(n1.to_arabic_indic())     # ٤٢
print(n1.to_devanagari())       # ४२
print(n1.to_bengali())          # ৪২
print(n1.to_cjk())              # 四十二
print(n1.to_roman())            # XLII
print(n1.to_scientific())       # 4.2e+01

UnicodeNumeral

Handles numerals in Unicode scripts.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from multilingualprogramming import UnicodeNumeral

# Arabic-Indic numerals
u1 = UnicodeNumeral("٣٧")
print(u1.to_int())    # 37

# Devanagari numerals (Hindi)
u2 = UnicodeNumeral("३७")
print(u2.to_int())    # 37

# Bengali numerals
u3 = UnicodeNumeral("৩৭")
print(u3.to_int())    # 37

# Tamil numerals
u4 = UnicodeNumeral("௩௭")
print(u4.to_int())    # 37

# CJK digits
u5 = UnicodeNumeral("三七")
print(u5.to_int())    # 37

RomanNumeral

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from multilingualprogramming import RomanNumeral

# From Roman string
r1 = RomanNumeral("XIV")
print(r1.to_int())      # 14
print(int(r1))          # 14

r2 = RomanNumeral("XLII")
print(r2.to_int())      # 42

# From integer
r3 = RomanNumeral(2024)
print(str(r3))          # MMXXIV

# Arithmetic
r4 = RomanNumeral("X") + RomanNumeral("V")
print(str(r4))          # XV

ComplexNumeral

1
2
3
4
5
6
7
8
9
10
from multilingualprogramming import ComplexNumeral

c1 = ComplexNumeral(3, 4)       # 3 + 4i
print(c1.real)                  # 3
print(c1.imag)                  # 4
print(c1.magnitude())           # 5.0
print(str(c1))                  # 3+4i

c2 = ComplexNumeral.from_string("2+3i")
c3 = c1 + c2

FractionNumeral

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from multilingualprogramming import FractionNumeral

f1 = FractionNumeral(1, 3)      # 1/3
f2 = FractionNumeral(1, 4)      # 1/4

print(f1.numerator)             # 1
print(f1.denominator)           # 3
print(float(f1))                # 0.3333...

f3 = f1 + f2                    # 1/3 + 1/4 = 7/12
print(f3.numerator)             # 7
print(f3.denominator)           # 12

# Unicode fractions
f4 = FractionNumeral.from_unicode("½")   # 1/2
f5 = FractionNumeral.from_unicode("¾")   # 3/4

NumeralConverter

Utility class for converting between numeral systems.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from multilingualprogramming import NumeralConverter

conv = NumeralConverter()

# To various scripts
print(conv.to_arabic_indic(42))     # ٤٢
print(conv.to_devanagari(42))       # ४२
print(conv.to_bengali(42))          # ৪২
print(conv.to_tamil(42))            # ௪௨
print(conv.to_cjk(42))              # 四十二
print(conv.to_roman(42))            # XLII

# From various scripts to integer
print(conv.to_int("٤٢"))            # 42 (Arabic-Indic)
print(conv.to_int("४२"))            # 42 (Devanagari)
print(conv.to_int("XLII"))          # 42 (Roman)
print(conv.to_int("四十二"))         # 42 (CJK)

# Detect script
print(conv.detect_script("٤٢"))     # "arabic_indic"
print(conv.detect_script("四十二"))  # "cjk"
print(conv.detect_script("XIV"))    # "roman"

Supported Numeral Scripts

Script Example Language use
Arabic (0-9) 42 Universal
Arabic-Indic ٤٢ Arabic
Devanagari ४२ Hindi, Sanskrit
Bengali ৪২ Bengali
Tamil ௪௨ Tamil
CJK 四十二 Chinese, Japanese
Roman XLII Latin, historical
Scientific 4.2e+01 Universal

Using Numerals in Programs

Multilingual programs can use any supported numeral literal directly:

1
2
3
4
5
6
7
# English program with Devanagari numeral
let count = ४२        # equivalent to 42
print(count + 8)     # 50

# French program with Arabic-Indic numeral
soit total = ٣٠ + ١٢
afficher(total)      # 42

The lexer recognizes numerals in all supported scripts and normalizes them to the canonical integer/float representation before parsing.