#currency #money #cryptocurrency #dollar

无 std 货币

允许对货币(包括现实世界货币和加密货币)进行泛型操作,支持编译时强制检查的数学运算和所有 ISO-4217 货币的支持

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神奇豆

Download history 119/week @ 2024-04-16 228/week @ 2024-04-23 174/week @ 2024-04-30 147/week @ 2024-05-07 94/week @ 2024-05-14 57/week @ 2024-05-21 179/week @ 2024-05-28 308/week @ 2024-06-04 208/week @ 2024-06-11 374/week @ 2024-06-18 127/week @ 2024-06-25 156/week @ 2024-07-02 126/week @ 2024-07-09 87/week @ 2024-07-16 77/week @ 2024-07-23 128/week @ 2024-07-30

430 每月下载量

MIT 许可证

74KB
1.5K SLoC

💰 货币

Crates.io docs.rs Build Status MIT License

这个包提供了一个泛型的 Currency 和相应的 Amount 类型,可以处理任意货币和加密货币的基本算术运算和格式化。主要功能包括

功能

  • 对所有 ISO-4217 货币的内置支持,具有适当的精度和格式化
  • 支持各种加密货币,也具有适当的底层数据类型和格式化。包括对 ETHBTCDOT 和其他各种加密货币的准确实现。
  • 可以在编译时指定是否强制使用 Amount 仅使用未经检查的数学运算,或者不使用。通常这无法控制,因为 core:ops 操作符被设置为需要在其宿主类型上实现未经检查的操作符,但是我已尽力使仅实现未经检查的数学运算成为可能,并可以通过 Amount<ETH, Checked> 样式的开关轻松控制。这对于可能导致灾难性问题的场景非常有利,并且在这种设置下,程序员被迫消耗由检查操作返回的 Option
  • 一个易于使用的宏,define_currency!,可以动态定义新的货币。
  • 这是一个痛苦包装的版本,实现了比 Parity 在 num-traits 功能中包含的更多有用的 num-traitsnum-integer 特性,这些特性在处理货币数量时经常是必需的:primitive_types::U256
  • 所有提供的货币都实现了大多数有用的 num-traitsnum-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