#numbers #format #formatter #round #separator #sign #display

scaler

一个方便的数字缩放、四舍五入和显示格式化工具

4个稳定版本

1.0.3 2024年8月25日
1.0.1 2024年8月23日
1.0.0 2024年8月22日

#95 in 值格式化

Download history 204/week @ 2024-08-18

204 每月下载量

MIT 许可证

43KB
330

scaler

简介

此crate提供了一种方便的Formatter,用于缩放、四舍五入和显示数字。

缩放描述了使用十进制二进制单位前缀来提高可读性的用法;尽管也支持无缩放和科学记数法。
四舍五入可以是到指定的量级,也可以是到有效数字的数量。
分隔符可以自由调整。分组分隔符在小数点前每3位数字处分隔数字组,而小数点分隔整数部分和小数部分。
符号行为可以设置为始终显示符号,仅在数字为负时显示符号,或永不显示符号。

用法

  1. 执行Formatter::new以创建具有默认设置的新的Formatter
  2. 使用设置器根据需要调整分隔符、四舍五入、缩放和符号行为。
  3. 使用Formatter::format格式化数字。

四舍五入

  • 量级:

    • 将数字四舍五入到$10^m$的位数。
    • 包含$m$。
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::Magnitude(-2));
    assert_eq!(f.format(123.456), "123,46");
    assert_eq!(f.format(0.789), "790 m");
    assert_eq!(f.format(42069), "42,06900 k");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::Magnitude(-1));
    assert_eq!(f.format(123.456), "123,5");
    assert_eq!(f.format(0.789), "800 m");
    assert_eq!(f.format(42069), "42,0690 k");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::Magnitude(0));
    assert_eq!(f.format(123.456), "123");
    assert_eq!(f.format(0.789), "1");
    assert_eq!(f.format(42069), "42,069 k");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::Magnitude(1));
    assert_eq!(f.format(123.456), "120");
    assert_eq!(f.format(0.789), "0");
    assert_eq!(f.format(42069), "42,07 k");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::Magnitude(2));
    assert_eq!(f.format(123.456), "100");
    assert_eq!(f.format(0.789), "0");
    assert_eq!(f.format(42069), "42,1 k");
    
  • 有效数字:

    • 将数字四舍五入到$n$个有效数字。
    • 包含$n$。
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::SignificantDigits(0));
    assert_eq!(f.format(123.456), "0");
    assert_eq!(f.format(0.789), "0");
    assert_eq!(f.format(42069), "0");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::SignificantDigits(1));
    assert_eq!(f.format(123.456), "100");
    assert_eq!(f.format(0.789), "800 m");
    assert_eq!(f.format(42069), "40 k");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::SignificantDigits(2));
    assert_eq!(f.format(123.456), "120");
    assert_eq!(f.format(0.789), "790 m");
    assert_eq!(f.format(42069), "42 k");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::SignificantDigits(3));
    assert_eq!(f.format(123.456), "123");
    assert_eq!(f.format(0.789), "789 m");
    assert_eq!(f.format(42069), "42,1 k");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::SignificantDigits(4));
    assert_eq!(f.format(123.456), "123,5");
    assert_eq!(f.format(0.789), "789,0 m");
    assert_eq!(f.format(42069), "42,07 k");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_rounding(scaler::Rounding::SignificantDigits(5));
    assert_eq!(f.format(123.456), "123,46");
    assert_eq!(f.format(0.789), "789,00 m");
    assert_eq!(f.format(42069), "42,069 k");
    

缩放

  • 二进制:

    • 以$2^{10} = 1.024$的因子缩放。
    • 如果没有为此量级定义前缀:回退到科学记数法。
    • 包含是否在数字和单位前缀之间放置空格。
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_scaling(scaler::Scaling::Binary(true));
    assert_eq!(f.format(0.5), "1,000 * 2^(-1)");
    assert_eq!(f.format(1), "1,000");
    assert_eq!(f.format(64), "64,00");
    assert_eq!(f.format(128), "128,0");
    assert_eq!(f.format(1023), "1.023");
    assert_eq!(f.format(1024), "1,000 Ki");
    assert_eq!(f.format(2_f64.powi(10)), "1,000 Ki");
    assert_eq!(f.format(2_f64.powi(20)), "1,000 Mi");
    assert_eq!(f.format(2_f64.powi(30)), "1,000 Gi");
    assert_eq!(f.format(2_f64.powi(40)), "1,000 Ti");
    assert_eq!(f.format(2_f64.powi(50)), "1,000 Pi");
    assert_eq!(f.format(2_f64.powi(60)), "1,000 Ei");
    assert_eq!(f.format(2_f64.powi(70)), "1,000 Zi");
    assert_eq!(f.format(2_f64.powi(80)), "1,000 Yi");
    assert_eq!(f.format(2_f64.powi(90)), "1,000 * 2^(90)");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_scaling(scaler::Scaling::Binary(false));
    assert_eq!(f.format(1024), "1,000Ki");
    
  • 十进制:

    • 以$10^{3} = 1.000$的因子缩放。
    • 如果没有为此量级定义前缀:回退到科学记数法。
    • 包含是否在数字和单位前缀之间放置空格。
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_scaling(scaler::Scaling::Decimal(true));
    assert_eq!(f.format(1e-31), "1,000 * 10^(-31)");
    assert_eq!(f.format(1e-30), "1,000 q");
    assert_eq!(f.format(1e-27), "1,000 r");
    assert_eq!(f.format(1e-24), "1,000 y");
    assert_eq!(f.format(1e-21), "1,000 z");
    assert_eq!(f.format(1e-18), "1,000 a");
    assert_eq!(f.format(1e-15), "1,000 f");
    assert_eq!(f.format(1e-12), "1,000 p");
    assert_eq!(f.format(1e-9), "1,000 n");
    assert_eq!(f.format(1e-6), "1,000 µ");
    assert_eq!(f.format(1e-3), "1,000 m");
    assert_eq!(f.format(1), "1,000");
    assert_eq!(f.format(10), "10,00");
    assert_eq!(f.format(100), "100,0");
    assert_eq!(f.format(999), "999,0");
    assert_eq!(f.format(1000), "1,000 k");
    assert_eq!(f.format(1e3), "1,000 k");
    assert_eq!(f.format(1e6), "1,000 M");
    assert_eq!(f.format(1e9), "1,000 G");
    assert_eq!(f.format(1e12), "1,000 T");
    assert_eq!(f.format(1e15), "1,000 P");
    assert_eq!(f.format(1e18), "1,000 E");
    assert_eq!(f.format(1e21), "1,000 Z");
    assert_eq!(f.format(1e24), "1,000 Y");
    assert_eq!(f.format(1e27), "1,000 R");
    assert_eq!(f.format(1e30), "1,000 Q");
    assert_eq!(f.format(1e33), "1,000 * 10^(33)");
    
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_scaling(scaler::Scaling::Decimal(false));
    assert_eq!(f.format(1000), "1,000k");
    
  • :

    • 无缩放
    • 不回退到科学记数法
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_scaling(scaler::Scaling::None);
    assert_eq!(f.format(1e-10), "0,0000000001000");
    assert_eq!(f.format(0.1), "0,1000");
    assert_eq!(f.format(1), "1,000");
    assert_eq!(f.format(10), "10,00");
    assert_eq!(f.format(100), "100,0");
    assert_eq!(f.format(1000), "1.000");
    assert_eq!(f.format(1e10), "10.000.000.000");
    
  • 科学:

    • 始终使用科学记数法
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_scaling(scaler::Scaling::Scientific);
    assert_eq!(f.format(0.1), "1,000 * 10^(-1)");
    assert_eq!(f.format(1), "1,000 * 10^(0)");
    assert_eq!(f.format(10), "1,000 * 10^(1)");
    

分隔符

  • group_separator
    • 在小数点前每3位数字处分隔数字组。
  • decimal_separator
    • 分隔数字的整数部分和小数部分。
let f: scaler::Formatter = scaler::Formatter::new()
    .set_scaling(scaler::Scaling::None)
    .set_separators(".", ",");
assert_eq!(f.format(1), "1,000");
assert_eq!(f.format(10), "10,00");
assert_eq!(f.format(100), "100,0");
assert_eq!(f.format(1000), "1.000");
assert_eq!(f.format(10000), "10.000");

let f: scaler::Formatter = scaler::Formatter::new()
    .set_scaling(scaler::Scaling::None)
    .set_separators("", ",");
assert_eq!(f.format(1), "1,000");
assert_eq!(f.format(10), "10,00");
assert_eq!(f.format(100), "100,0");
assert_eq!(f.format(1000), "1000");
assert_eq!(f.format(10000), "10000");

let f: scaler::Formatter = scaler::Formatter::new()
    .set_scaling(scaler::Scaling::None)
    .set_separators(",", ".");
assert_eq!(f.format(1), "1.000");
assert_eq!(f.format(10), "10.00");
assert_eq!(f.format(100), "100.0");
assert_eq!(f.format(1000), "1,000");
assert_eq!(f.format(10000), "10,000");

符号

  • 始终

    • 始终显示符号,即使数字为正数。
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_sign(scaler::Sign::Always);
    assert_eq!(f.format(std::f64::NEG_INFINITY), "-∞");
    assert_eq!(f.format(-1), "-1,000");
    assert_eq!(f.format(0), "+0,000");
    assert_eq!(f.format(1), "+1,000");
    assert_eq!(f.format(std::f64::INFINITY), "+∞");
    
  • OnlyMinus

    • 仅当数字为负时显示符号。
    let f: scaler::Formatter = scaler::Formatter::new()
        .set_sign(scaler::Sign::OnlyMinus);
    assert_eq!(f.format(std::f64::NEG_INFINITY), "-∞");
    assert_eq!(f.format(-1), "-1,000");
    assert_eq!(f.format(0), "0,000");
    assert_eq!(f.format(1), "1,000");
    assert_eq!(f.format(std::f64::INFINITY), "");
    

依赖项

~87KB