3个版本
0.1.2 | 2023年5月16日 |
---|---|
0.1.1 | 2023年5月16日 |
0.1.0 | 2023年5月14日 |
#172 in 金融
在 moneyman_cli 中使用
39KB
797 行
💱 moneyman
一个古老的货币转换器
示例
$ moneyman convert 50 --from EUR --to PHP --on 2023-05-06 --fallback
50 EUR -> 3044.5833333333350 PHP on the date 2023-05-06
moneyman
也可以作为一个库使用。
use std::path::PathBuf;
use chrono::NaiveDate;
use rust_decimal_macros::dec;
use rusty_money::{iso, Money};
fn main() {
// Choose where to save the historical data files.
let data_dir: PathBuf = dirs::home_dir()
.and_then(|home_dir| Some(home_dir.join(".moneyman")))
.expect("need a home directory");
// Fetches the historical data from European Central Bank, and creates an
// exchange store.
let store = moneyman_core::ExchangeStore::sync(data_dir).expect("failed ze sync");
let amount_in_usd = Money::from_decimal(dec!(6500), iso::USD);
let date = NaiveDate::from_ymd_opt(2023, 5, 4).expect("ok date");
// Converts 6,500.00 USD to EUR
let actual = store.convert_on_date(amount_in_usd, iso::EUR, date);
let expected = Money::from_decimal(dec!(5869.6044789597254831135994221), iso::EUR);
// Shouldn't explode? :)
assert_eq!(actual, expected);
}
详情
moneyman
扩展了 rusty-money
,因为它已经提供了许多功能,如 Money
、Currency
、ExchangeRate
和 Exchange
。然而,它不提供任何实际的货币转换数据。对于历史数据,moneyman
使用欧洲中央银行,并将数据保存到自己的本地数据存储中。
注意事项
一个重要的事情是要知道,ANY_OTHER_CURRENCY
-> EUR 是通过 1/<RATE_OF_ONE_EUR_IN_THAT_OTHER_CURRENCY>
来计算的,因为欧洲央行只包含 EUR -> ANY_OTHER_CURRENCY
的比率,而不包含相反的比率。这种[除法]最可能不是真实世界™货币交换所观察到的行为。所以这最多只能作为一个近似值。
依赖项
~32–45MB
~767K SLoC