Skip to main content

A library for biredirectional conversion between numeral systems. Supports 46 different systems across all numeral systems available in Unicode. Families include Aramaic, Brahmi, Cuneiform, Egyptian, Ethiopic, Greek, Hebrew, Hindu-Arabic, Kaktovik, Kharosthi, Mayan, Medefaidrin, Nabataean, Pahlavi, Phoenician, Roman, Sino-Tibetan, Siyaq, Sogdian, and South Arabian.

Project description

Swopy

A library for biredirectional conversion between numeral systems. Supports 46 different systems across all numeral systems available in Unicode.

Supported Numeral Systems

  • Aramaic:
    • Hatran, supporting integers between 1 and 999
    • ImperialAramaic, supporting integers between 1 and 99,999
    • Palmyrene, supporting integers between 1 and 99
  • Brahmi:
    • Brahmi, supporting integers between 1 and 9,999
  • Brahmi-Dravidian:
    • Grantha, supporting integers between 0 and infinity (base-7 positional)
    • Saurashtra, supporting integers between 0 and infinity
    • Tamil, supporting integers between 1 and 9,999
  • Brahmi-Gupta:
    • Bhaiksuki, supporting integers between 1 and 999
    • SinhalaArchaic, supporting integers between 1 and 9,999
  • Brahmi-Tai:
    • Ahom, supporting integers between 0 and infinity
  • Cuneiform:
    • Cuneiform, supporting integers between 1 and 999
  • Egyptian:
    • Egyptian, supporting integers between 1 and 1,000,000/many
    • CopticEpact, supporting integers between 1 and 9,999
  • Ethiopic:
    • Ethiopic, supporting integers between 1 and 99,999,999
  • Greek:
    • Aegean, supporting integers between 1 and 99,999
    • Alphabetic, supporting integers between 1 and 9,999
    • Attic, supporting integers and base-4 fractions between 1/4 and 99,999
    • Etruscan, supporting integers between 1 and 399
    • Milesian, supporting integers between 1 and 9,999
  • Hebrew:
    • Hebrew, supporting integers between 1 and 9,999
  • Hindu-Arabic:
    • Arabic, supporting integers, floats and fractions between -math.inf and math.inf. Also available in arabic.Arabic
    • Bakhshali, supporting integers between 1 and 9,999
  • Kaktovik:
    • Kaktovik, supporting integers between -infinity and +infinity
  • Kharosthi:
    • Kharosthi, supporting integers between 1 and 9,999
  • Mayan:
    • Mayan, supporting integers between 0 and infinity
  • Medefaidrin:
    • Medefaidrin, supporting integers between 0 and infinity (base-20 positional)
  • Nabataean:
    • Nabataean, supporting integers between 1 and 999
  • Numeric Systems:
    • CountingRod, supporting integers between 1 and 99
  • Pahlavi:
    • InscriptionalParthian, supporting integers between 1 and 9,999
    • InscriptionalPahlavi, supporting integers between 1 and 9,999
    • PsalterPahlavi, supporting integers between 1 and 999
  • Phoenician:
    • Phoenician, supporting integers between 1 and 999
  • Roman, in the forms:
    • Early, supporting integers between 1 and 899
    • Standard, supporting integers and base-12 fractions between 1/12 and 3,999
    • Apostrophus, supporting integers between 1 and 100,000
  • Sino-Tibetan:
    • Chinese, supporting integers between 1 and 99,999,999
    • Khitan, supporting integers between 1 and 99,999,999
    • Suzhou, supporting integers between 0 and infinity
    • Tangut, supporting integers between 1 and 99,999,999
  • Siyaq:
    • IndicSiyaq, supporting integers between 1 and 99,999
    • OttomanSiyaq, supporting integers between 1 and 99,999
  • Sogdian:
    • Manichaean, supporting integers between 1 and 999
    • OldSogdian, supporting integers between 1 and 999
    • Sogdian, supporting integers between 1 and 999
  • South Arabian:
    • AncientNorthArabian, supporting integers between 1 and 99
    • AncientSouthArabian, supporting integers between 1 and 99,999

Installation

Install the package:

pip install swopy # or
uv add swopy

Usage

Basic Conversion

import swopy
from swopy import systems

# Convert integer Roman numeral to Egyptian hieroglyphic
swopy.swop('IX', systems.roman.Standard, systems.egyptian.Egyptian)
# '𓏺𓏺𓏺𓏺𓏺𓏺𓏺𓏺𓏺'

# Convert Apostrophus to an Arabic integer
swopy.swop('IↃI', systems.roman.Apostrophus, systems.arabic.Arabic)
# 501

Available Systems

import swopy
import pprint
systems = swopy.get_all_systems()
pprint.pprint(systems)

#{'arabic.Arabic': <class 'swopy.systems.arabic.Arabic'>,
# 'egyptian.Egyptian': <class 'swopy.systems.egyptian.Egyptian'>,
# 'etruscan.Etruscan': <class 'swopy.systems.etruscan.Etruscan'>,
# 'greek.Milesian': <class 'swopy.systems.greek.Milesian'>,
# 'roman.Apostrophus': <class 'swopy.systems.roman.Apostrophus'>,
# 'roman.Early': <class 'swopy.systems.roman.Early'>,
# 'roman.Standard': <class 'swopy.systems.roman.Standard'>
# ...}

swopy.swop(42, systems['arabic.Arabic'], systems['roman.Early'])
# 'XLII'

Error Handling

Swopy will raise a ValueError if there is a number is not representable in a numeral system

import swopy
from swopy import systems

swopy.swop(4000, systems.arabic.Arabic, systems.roman.Standard)
# ValueError: Number must be less than or equal to 3999.

systems.roman.Early.to_numeral(900)
# ValueError: Number must be less than or equal to 899.

or if a numeral is invalid

import swopy
from swopy import systems

swopy.swop('IIIII', systems.egyptian.Egyptian, systems.roman.Early)
# ValueError: Invalid Egyptian hieroglyph: I

systems.roman.Apostrophus.from_numeral('P')
# ValueError: Invalid Apostrophus characters at position 0

and will raise a TypeError if a numeral is not representable in a system.

import swopy
from swopy import systems

swopy.swop(1.2, systems.arabic.Arabic, systems.roman.Early)
# TypeError: 1.2 of type float cannot be represented in Early.

swopy.swop('I', systems.arabic.Arabic, systems.roman.Early)
# TypeError: I of type str cannot be represented in Arabic.

systems.egyptian.Egyptian.to_numeral(10.1)
# TypeError: 10.1 of type float cannot be represented in Egyptian.

Requirements

Swopy only relies on the standard library and needs Python 3.13 or higher. Swopy is currently tested on the latest versions of Windows, MacOS and Ubuntu for Python versions 3.13, 3.14.0, 3.14.3, and 3.15.

Development

Dependencies

Development dependencies are managed through pyproject.toml:

# Install development dependencies
sh scripts/startup.sh

Dev tools include:

  • pytest / pytest-cov: Testing framework
  • ruff: Fast Python linter and formatter
  • pyright: Static type checker
  • deptry: Dependency validation
  • hypothesis: Property-based testing
  • pre-commit: Git hooks framework
  • tox, with tox-uv: Test runner
  • uv

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

swopy-0.1.14.tar.gz (112.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

swopy-0.1.14-py3-none-any.whl (70.9 kB view details)

Uploaded Python 3

File details

Details for the file swopy-0.1.14.tar.gz.

File metadata

  • Download URL: swopy-0.1.14.tar.gz
  • Upload date:
  • Size: 112.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for swopy-0.1.14.tar.gz
Algorithm Hash digest
SHA256 47555426c4e3a31e02bbb5e80cbbd8b0948825a26ebc2ed2a2a74df87ef5ea92
MD5 bd8ff4592a716e995651ee5aa05b3907
BLAKE2b-256 75e09ba0e59f174dd6fb0edf194e4f0441de2c149eb1080484b92c6a6e346579

See more details on using hashes here.

File details

Details for the file swopy-0.1.14-py3-none-any.whl.

File metadata

  • Download URL: swopy-0.1.14-py3-none-any.whl
  • Upload date:
  • Size: 70.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for swopy-0.1.14-py3-none-any.whl
Algorithm Hash digest
SHA256 f48bd0fe4dc6e49a9dbb6132d974b1ee9cd0239666c45d055d7290b7bc1de559
MD5 55046232ee15988caabfd6dad13b81b9
BLAKE2b-256 040f638c16b199c6d24760e2c287c72d58d255f24e3c219800f3b9ed390939d3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page