Skip to main content

Precise monetary calculations using integer cents with currency support and formatting

Project description

philiprehberger-money

Precise monetary calculations using integer cents with currency support and formatting.

Installation

pip install philiprehberger-money

Usage

Creating Money

from philiprehberger_money import Money

price = Money.from_major(19.99, "USD")
free = Money.zero("EUR")

Arithmetic

a = Money.from_major(10.00, "USD")
b = Money.from_major(3.50, "USD")

total = a + b          # $13.50
diff = a - b           # $6.50
doubled = a * 2        # $20.00
split = a.divide(3)    # $3.33 (rounded)
negated = -a           # -$10.00

Safe Currency Handling

usd = Money.from_major(10, "USD")
eur = Money.from_major(10, "EUR")

usd + eur  # raises CurrencyMismatchError

Allocation (Split Without Losing Cents)

total = Money.from_major(100.00, "USD")

# Split 50/30/20
shares = total.allocate([50, 30, 20])
# [Money($50.00), Money($30.00), Money($20.00)]

# Handles remainders correctly
odd = Money.from_major(10.00, "USD")
thirds = odd.allocate([1, 1, 1])
# [Money($3.34), Money($3.33), Money($3.33)]

Formatting

price = Money.from_major(1234.56, "USD")

print(price.format())          # "1234.56 USD"
print(price.format(symbol="$")) # "$1234.56"

Comparisons

a = Money.from_major(10, "USD")
b = Money.from_major(20, "USD")

a < b   # True
a == b  # False
a.is_positive()  # True
a.is_zero()      # False

Zero-Decimal Currencies

yen = Money.from_major(1000, "JPY")
print(yen.format(symbol="\u00a5"))  # "\u00a51000"

Serialization

m = Money.from_major(19.99, "USD")

d = m.to_dict()           # {"amount_cents": 1999, "currency": "USD"}
m2 = Money.from_dict(d)   # Money(19.99 USD)

API Reference

Method Description
Money.from_major(amount, currency) Create from major units (dollars, euros, etc.)
Money.zero(currency) Create zero-value Money
Money.from_dict(data) Create from dict
.add(other) / + Add two Money values (same currency)
.subtract(other) / - Subtract (same currency)
.multiply(factor) / * Multiply by number
.divide(divisor) Divide by number
.allocate(ratios) Split into parts without losing cents
.negate() / -m Negate amount
.abs() Absolute value
.is_zero() / .is_positive() / .is_negative() Predicates
.format(symbol=None) Format as string
.to_dict() Serialize to dict
.amount Major unit value as float
.decimals Currency decimal places

License

MIT

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

philiprehberger_money-0.2.0.tar.gz (5.7 kB view details)

Uploaded Source

Built Distribution

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

philiprehberger_money-0.2.0-py3-none-any.whl (5.2 kB view details)

Uploaded Python 3

File details

Details for the file philiprehberger_money-0.2.0.tar.gz.

File metadata

  • Download URL: philiprehberger_money-0.2.0.tar.gz
  • Upload date:
  • Size: 5.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for philiprehberger_money-0.2.0.tar.gz
Algorithm Hash digest
SHA256 035134e21dc9373ff67f1eb2d734bce621ecbb9c099cc6121f355840d09896ca
MD5 3917b6e82338ce3910dabefedd2b9bab
BLAKE2b-256 0d61e47c70dc860902bc93ba1c278c3b9d6aa2fee6ca5c5dd55bce83bae0d753

See more details on using hashes here.

File details

Details for the file philiprehberger_money-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for philiprehberger_money-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d2f7b64aae3aa0e51d09914ecc14e1296fb57c47cd3fbe67d792a668f3a9543a
MD5 de1d873805678384f2aacfc2d645aed0
BLAKE2b-256 cfa510822776e5b6c49c24f31e50ea598aa5f8b5e8d5daac7ebe99150ee6a7da

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