7 个版本 (4 个重大更改)
0.5.0 | 2024年7月29日 |
---|---|
0.4.0 | 2023年5月19日 |
0.3.3 | 2023年5月19日 |
0.3.2 | 2023年1月21日 |
0.1.1 | 2022年5月23日 |
在 金融 中排名第 25
每月下载量 134 次
78KB
2K SLoC
使用金钱金额进行货币安全计算。
Money
是一种特殊的数量类型。其单位类型称为 Currency
。
金钱与物理数量的主要区别在于两个方面
-
金钱金额是离散的。对于每种货币,都有一个无法进一步分割的最小分数。
-
不同货币之间的关系不是固定的,而是随时间变化。
此包提供了处理这些特定情况的数据类型。它基于包含“fpdec”功能的“quantities”包(将“AmountT”别名为“Decimal”)。
Currency
是 ISO 4217 中定义的所有货币的枚举。此外,对于每种货币,都有一个以 3 位 ISO 4217 代码命名的常量。
Currency
实现 quantities::Unit
,因此可以将所有单位操作应用于 Currency
。特别是,可以乘以一个 AmountT
来创建一个 Money
实例。
示例
# use moneta::{Amnt, Currency, Dec, Decimal, EUR, Money, Quantity, Unit};
let amnt = Amnt!(17.95);
let eur_amnt = amnt * EUR;
assert_eq!(eur_amnt.amount(), amnt);
assert_eq!(eur_amnt.unit(), Currency::EUR);
Money
实现 trait quantities::Quantity
,因此可以将所有数量操作应用于 Money
的实例。由于货币之间没有固定的关系,因此不同货币的金钱金额之间没有隐式转换。结果值始终量化为与货币定义的最小分数。
示例
# use moneta::{Amnt, Currency, Dec, Decimal, EUR, Money, Quantity, Unit};
let qty = Amnt!(3.2);
let price = Money::new(Amnt!(13.58), EUR);
let total = qty * price;
assert_eq!(total.to_string(), "43.46 EUR");
可以使用类型 ExchangeRate
定义两种货币之间的转换系数。它提供了一个单位货币(也称为基本货币)、单位倍数、术语货币(也称为价格货币)和术语金额,即与单位货币中单位倍数相当的术语货币金额。
将某种货币的金额与单位货币相同的汇率相乘,得到等值的术语货币金额。同样,将某种货币的金额与术语货币相同的汇率相除,得到等值的单位货币金额。
示例
# use moneta::{Dec, Decimal, ExchangeRate, EUR, HKD, USD};
let usd = Dec!(17.95) * USD;
let rate = ExchangeRate::new(USD, 1, EUR, Dec!(0.98078));
let eur = usd * rate;
assert_eq!(eur.to_string(), "17.61 EUR");
let rate = ExchangeRate::new(HKD, 10, EUR, Dec!(1.187253));
let hkd = eur / rate;
assert_eq!(hkd.to_string(), "148.33 HKD");
箱体功能
默认情况下,只有功能 std
被启用。
生态系统
- std - 当启用时,这将导致
moneta
使用标准库,因此可以提供字符串转换、格式化和打印功能。当禁用时,需要使用 cratealloc
与系统特定的分配器来使用该功能。
可选依赖
- serde - 当启用时,启用
serde
的支持。
依赖
~1.2–1.8MB
~36K SLoC