#format-string #currency #money #format #decimal-number

accounting

accounting 是一个用于货币和货币格式化的库

3 个不稳定版本

0.2.0 2022年2月20日
0.1.1 2022年1月25日
0.1.0 2022年1月25日

#88 in 财务

41 次每月下载
2 crates 中使用

MIT 许可证

46KB
655

accounting

Crate API

accounting 是一个用于货币和货币格式化的库。 (受 golang 的 accounting 启发)

示例

use accounting::Accounting;
fn main() {
    let mut ac = Accounting::new_from("$", 2);
    ac.set_format("{s} {v}");
    assert_eq!(ac.format_money(1000000), "$ 1,000,000.00");
    assert_eq!(ac.format_money(-5000), "-$ 5,000.00");
}

设置 Accounting 变量的格式化字符串,然后将数字格式化为货币值。在格式化字符串中

  • {v} 是值的占位符,将被数字替换。
  • {s} 是符号的占位符,将被货币符号(如 $、¥ 等)替换。
#[cfg(feature="decimal")]
fn format_decimal_type() {
    let mut ac = Accounting::new_from("$", 2);
    ac.set_format("{s} {v}");
    let x = rust_decimal::Decimal::new(-12345678921, 2);
    assert_eq!(ac.format_money(x), "-$ 123,456,789.21"); 
}

如果您想使用十进制数,启用功能 decimal,然后您可以使用 rust_decimal 库支持的十进制数。如下所示。

Accounting 结构体

pub struct Accounting {
	symbol: String,
	precision: usize,  
	thousand: String,
	decimal: String, 
	format_positive: String,
	format_negative: String,
	format_zero: String
}
字段 类型 描述 默认值 示例
symbol String 货币符号 $ $
precision usize 货币精度(小数位数) 0 2
thousand String 千位分隔符 , .
decimal String 小数分隔符 . ,
format_positive String 正值的格式化字符串({v} = 值,{s} = 符号) {s}{v} {s} {v}
format_negative String 负值的格式化字符串 -{s}{v} {s} ({v})
format_zero String 零值的格式化字符串 {s}{v} {s} --

示例

  • 设置格式化字符串。
let mut ac = Accounting::new_from("$", 2);
ac.set_format_positive("{s} {v}");
ac.set_format_negative("{s} ({v})");
ac.set_format_zero( "{s} --");
assert_eq!(ac.format_money(1000000), "$ 1,000,000.00");
assert_eq!(ac.format_money(-5000), "$ (5,000.00)");
assert_eq!(ac.format_money(0), "$ --");
  • 设置千位分隔符。
let mut ac = Accounting::new_from("$", 2);
ac.set_thousand_separator("'");
assert_eq!(ac.format_money(123456789.213123), "$123'456'789.21")
  • 设置小数分隔符。
let mut ac = Accounting::new_from("$", 2);
ac.set_decimal_separator("'");
assert_eq!(ac.format_money(123456789.213123), "$123,456,789'21")

format_money 函数参数需要实现 FormatNumber 特性。

FormatNumber 特性

FormatNumber 是库中的一个特性。实现了此特性的类型可以使用自定义精度和分隔符格式化为字符串。已实现类型包括

  • 原始类型:i8, u8, i16, u16, i32, u32, i64, u64, i128, u128, isize, usize, f32, f64。
  • 十进制类型:rust_decimal::Decimal 特性定义
pub trait FormatNumber {
    fn format_number(&self, precision: usize, thousand: &str, decimal: &str) -> String;
}

示例

use accounting::FormatNumber;
let x = 123456789.213123f64;
assert_eq!(x.format_number(2, ",", "."), "123,456,789.21");

unformat 函数

unformat 函数删除所有货币格式化并返回数字字符串。

示例

use accounting::unformat;
assert_eq!(unformat("$4,500.23", 2, "USD"), Ok("4500.23".to_string()));
assert_eq!(unformat("EUR 12.500,3474", 3, "EUR"), Ok("12500.347".to_string()));

依赖

~2–3.5MB
~59K SLoC