11 个版本

0.4.1 2021年1月16日
0.3.6 2020年12月27日
0.3.5 2020年7月27日
0.3.3 2020年3月13日
0.2.0 2019年12月21日

#815 in 神奇豆子

Download history 3229/week @ 2024-03-14 2978/week @ 2024-03-21 2422/week @ 2024-03-28 2700/week @ 2024-04-04 2611/week @ 2024-04-11 2383/week @ 2024-04-18 3002/week @ 2024-04-25 2709/week @ 2024-05-02 2721/week @ 2024-05-09 2259/week @ 2024-05-16 1999/week @ 2024-05-23 2441/week @ 2024-05-30 2305/week @ 2024-06-06 2015/week @ 2024-06-13 1903/week @ 2024-06-20 1456/week @ 2024-06-27

8,323 每月下载量
1717 个crate(14 个直接) 中使用

MIT 许可证

115KB
3K SLoC

rusty-money ── 构建状态 最新版本 文档

rusty-money 处理与货币打交道的繁琐部分,如舍入、精度、解析和国际化。它支持 ISO-4217 货币、常见的加密货币,并允许你定义自己的货币。库主要导出的项目是 Moneyisocrypto 货币集合。

用法

通过提供金额和货币创建 Money 对象。金额可以是数字或字符串类型,但内部将存储为精确的小数。你可以选择捆绑的货币或创建自己的货币。以下是一个快速示例,说明如何创建自己的 Currency 并使用它创建一些 Money

use rusty-money::{Money, define_currency_set};

define_currency_set!(
  video_game {
    GIL: {
      code: "GIL",
      exponent: 2,
      locale: Locale::EnUs,
      minor_units: 100,
      name: "GIL",
      symbol: "G",
      symbol_first: true,
    }
  }
);

Money::from_major(2_000, video_game::GIL);              // 2000 GIL
Money::from_minor(200_000, video_game::GIL);            // 2000 GIL
Money::from_str("2,000.00", video_game::GIL).unwrap();  // 2000 GIL
 
// Currencies can be looked up by code. 
let gil = video_game::find("GIL").unwrap();                        
Money::from_major(2_000, gil);                          // 2000 GIL

特性:货币集合

rusty_money 提供了两个货币集合以方便使用:默认启用的 iso,它实现了 ISO-4217 货币,以及 crypto,它实现了流行的加密货币。你可以通过启用功能添加 crypto

[dependencies]
rusty-money = { version = "0.4.0", features = ["iso", "crypto"] }

然后可以像这样使用货币集合

use rusty-money::{Money, iso, crypto};

Money::from_major(2_000, iso::USD);        // 2000 U.S Dollars
Money::from_major(2_000, iso::GBP);        // 2000 British Pounds
Money::from_major(2, crypto::BTC);         // 2 Bitcoin

相同货币的货币对象可以进行比较

use rusty-money::{Money, iso};
let hundred = Money::from_minor(10_000, iso::USD);
let thousand = Money::from_minor(100_000, iso::USD);

println!("{}", thousand > hundred);     // false
println!("{}", thousand.is_positive()); // true

精度、舍入和数学

货币对象是不可变的,改变金额的操作将创建一个新的Money实例。金额存储为128位固定精度的十进制数,可以处理高达296 / 1028的值。对Money的操作保留最大可能的精度。当您需要更低的精度时,可以调用round函数,它支持三种模式

Money可以像这样进行加、减、乘、除操作

use rusty-money::{Money, Round, iso};

Money::from_minor(100, iso::USD) + Money::from_minor(100, iso::USD);  // 2 USD
Money::from_minor(100, iso::USD) - Money::from_minor(100, iso::USD);  // 0 USD
Money::from_minor(100, iso::USD) * 3;                                 // 3 USD
Money::from_minor(100, iso::USD) / 3;                                 // 0.333... USD

let usd = Money::from_str("-2000.005", iso::USD).unwrap();            // 2000.005 USD
usd.round(2, Round::HalfEven);                                        // 2000.00 USD
usd.round(2, Round::HalfUp);                                          // 2000.01 USD
usd.round(0, Round::HalfUp);                                          // 2000 USD

格式化

在Money上调用format!println!会返回一个字符串,其中包含四舍五入的金额,使用分隔符和符号根据货币的本地化设置。如果您需要自定义此输出,Formatter模块接受一组更详细的参数。

use rusty-money::{Money, iso};
let usd = Money::from_str("-2000.009", iso::USD).unwrap();
let eur = Money::from_str("-2000.009", iso::EUR).unwrap();

println!("{}", usd);                                        // -$2,000.01
println!("{}", eur);                                        // -€2.000,01;

兑换

该库还提供了两种额外的类型 - ExchangeExchangeRates,用于将Money从一种货币转换为另一种货币。

use rusty-money::{Money, Exchange, ExchangeRate, iso};
use rust_decimal_macros::*;

// Convert 1000 USD to EUR at a 2:1 exchange rate.
let rate = ExchangeRate::new(iso::USD, iso::EUR, dec!(0.5)).unwrap();
rate.convert(Money::from_minor(100_000, iso::USD));                    // 500 EUR

// An Exchange can be used to store ExchangeRates for later use
let mut exchange = Exchange::new();
exchange.set_rate(&rate);
exchange.get_rate(iso::USD, iso::EUR);

依赖项

~685KB
~13K SLoC