#货币 #金钱 #兑换

无需 std moneta

使用金钱金额进行货币安全计算

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

Download history 19/week @ 2024-07-02 72/week @ 2024-07-23 62/week @ 2024-07-30

每月下载量 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 使用标准库,因此可以提供字符串转换、格式化和打印功能。当禁用时,需要使用 crate alloc 与系统特定的分配器来使用该功能。

可选依赖

  • serde - 当启用时,启用 serde 的支持。

依赖

~1.2–1.8MB
~36K SLoC