MonetaryAmount
A Swift representation of money / monetary amounts and ISO 4217 currency designations. Supports manipulation and combination of monetary amounts of a single currency or multiple currencies.
Handles minor units (the exponent, e.g. cents for USD) for each currency as specified in the ISO 4217 standard. Simple manipulation includes consolidating / combining amounts.
MonetaryAmount
values that have the same Currency
will be added together, MonetaryAmount
values with
unique Currency
values will be added to the result on their own.
Installation
Cocoapods
pod 'MonetaryAmount', '~> 1.1.0'
Swift Package Manager
dependencies: [
.package(url: "https://github.com/SoftwareEngineerChris/MonetaryAmount.git", from: "1.1.0")
]
Usage Example
let moneyA = 12.00.in(.USD)
let moneyB = 18.00.in(.USD)
let moneyC = 6.00.in(.GBP)
// result would equal [30.00.in(.USD), 6.00.in(.GBP)]
let result = [moneyA, moneyB, moneyC].consolidating(moneyB)
The underlying value for the amount is represented by a DynamicRoundedDecimal
which
itself uses the Swift Decimal
type. DynamicRoundedDecimal
handles rounding internally
as declared by the given currency’s minorUnit
.
Construction
// moneyA and moneyB are equal and represent US$28.53
let moneyA = MonetaryAmount(currency: Currency.USD, value: Decimal(string: "28.529372")!)
let moneyB = 28.53.in(.USD)
Note
MonetaryAmount
does not do any FX or conversion of currencies, it keeps each individual
currency subtotal separate.