11 个版本 (4 个重大更改)
0.4.1 | 2024 年 6 月 21 日 |
---|---|
0.4.0 | 2024 年 6 月 5 日 |
0.3.2 | 2024 年 4 月 4 日 |
0.2.0 | 2024 年 3 月 26 日 |
0.0.1 | 2023 年 8 月 13 日 |
1632 在 神奇豆
430 每月下载量
74KB
1.5K SLoC
💰 货币
这个包提供了一个泛型的 Currency
和相应的 Amount
类型,可以处理任意货币和加密货币的基本算术运算和格式化。主要功能包括
功能
- 对所有 ISO-4217 货币的内置支持,具有适当的精度和格式化
- 支持各种加密货币,也具有适当的底层数据类型和格式化。包括对
ETH
、BTC
、DOT
和其他各种加密货币的准确实现。 - 可以在编译时指定是否强制使用
Amount
仅使用未经检查的数学运算,或者不使用。通常这无法控制,因为core:ops
操作符被设置为需要在其宿主类型上实现未经检查的操作符,但是我已尽力使仅实现未经检查的数学运算成为可能,并可以通过Amount<ETH, Checked>
样式的开关轻松控制。这对于可能导致灾难性问题的场景非常有利,并且在这种设置下,程序员被迫消耗由检查操作返回的Option
。 - 一个易于使用的宏,
define_currency!
,可以动态定义新的货币。 - 这是一个痛苦包装的版本,实现了比 Parity 在
num-traits
功能中包含的更多有用的num-traits
和num-integer
特性,这些特性在处理货币数量时经常是必需的:primitive_types::U256
- 所有提供的货币都实现了大多数有用的
num-traits
和num-integer
特性。 - 对所有上述内容进行了彻底的测试。
示例
#[test]
fn show_off_currency_math() {
use currency::*;
let apple_cost = amt!(USD, "$3.24");
let orange_cost = Amount::<USD>::from_raw(7_97);
assert!(apple_cost < orange_cost);
assert!(apple_cost + orange_cost > orange_cost);
assert_eq!(format!("{}", apple_cost * orange_cost), "$25.82");
assert_eq!(format!("{}", apple_cost * 3), "$9.72");
let mut total = amt!(DOT, "57622449841.0000000004 DOT");
total -= amt!(DOT, "1000.0 DOT");
total *= Amount::from_raw(2_0000000000u64.into());
assert_eq!(format!("{}", total), "115244897682.0000000008 DOT");
}
#[test]
fn show_off_checked_math() {
use currency::*;
use safety::*;
// When using currency amounts with `Safety = Checked`, the Amount struct has been specially set
// up so that only checked math will be allowed, and you can still use the normal
// operator-based syntax. Thus currency amounts like this should never panic and are
// suitable for use in critical/infallible environments.
let drink_cost = amt_checked!(USD, "$6.29");
let movie_cost = Amount::<USD, Checked>::from_raw(24_99);
let Some(outing_cost) = drink_cost + movie_cost else {
unimplemented!("compiler forces you to handle this!")
};
assert_eq!(format!("{}", outing_cost), "$31.28");
}
未来工作
- 通过十进制字面量定义
Amount
的附加宏 - 货币转换功能,可能包括在线数据源
- 将
Signedness
支持添加到Amount
- 附加测试
- 通过一个额外的 const generic 默认为
Positive
的默认值来支持负金额
依赖项
约 3.5-5MB
约 95K SLoC