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 神奇豆子
8,323 每月下载量
在 17 个 17 个crate(14 个直接) 中使用
115KB
3K SLoC
rusty-money ──

rusty-money 处理与货币打交道的繁琐部分,如舍入、精度、解析和国际化。它支持 ISO-4217 货币、常见的加密货币,并允许你定义自己的货币。库主要导出的项目是 Money
和 iso
及 crypto
货币集合。
用法
通过提供金额和货币创建 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;
兑换
该库还提供了两种额外的类型 - Exchange
和ExchangeRates
,用于将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