#currency #cli #conversion #date #fallback #money #moneyman

app moneyman_cli

一个简单的货币转换 CLI

3 个版本

0.1.2 2023年5月16日
0.1.1 2023年5月16日
0.1.0 2023年5月14日

466日期和时间

每月 30 次下载

BSD-3-Clause

58KB
1K SLoC

💱 moneyman

Crates.io docs.rs Crates.io

一个古老的货币转换器

moneyman_cli

示例

$ 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);
}

详情

moneymanrusty-money 的基础上扩展,因为它已经提供了许多东西,如 MoneyCurrencyExchangeRateExchange。然而,它并不提供实际转换货币所需的数据。对于历史数据,moneyman 使用欧洲中央银行,并将数据保存到其自己的本地数据存储中。

注意事项

需要知道的一个重要的事情是,ANY_OTHER_CURRENCY -> EUR 是通过 1/<RATE_OF_ONE_EUR_IN_THAT_OTHER_CURRENCY> 计算的,因为欧洲央行只包含 EUR -> ANY_OTHER_CURRENCY 的汇率,而不包含相反的汇率。这种行为[除法]最可能是 RealWord™ 货币交易所观察到的行为。因此,这最多只是一个近似值。

依赖项

~33–49MB
~799K SLoC