2 unstable releases

0.2.0 Nov 14, 2022
0.1.0 Nov 11, 2022

#238 in Value formatting

Download history 114/week @ 2024-07-27 185/week @ 2024-08-03 67/week @ 2024-08-10 94/week @ 2024-08-17 80/week @ 2024-08-24 51/week @ 2024-08-31 116/week @ 2024-09-07 73/week @ 2024-09-14 54/week @ 2024-09-21 50/week @ 2024-09-28 64/week @ 2024-10-05 47/week @ 2024-10-12 41/week @ 2024-10-19 66/week @ 2024-10-26 96/week @ 2024-11-02 58/week @ 2024-11-09

263 downloads per month
Used in 2 crates

MIT/Apache

33KB
647 lines

formato

Easily format numbers into string representation
Works for integers (u8-u128 and i8-i128) and floats (f32, f64)
Allows you to specify location of thousands separator, number of decimals, different format for positive, negative and zero values. e.g.

  • 1,000,000
  • 0012
  • (4 234.56)

Similar to numerical formatting in Excel and C#

Simple examples

use formato::{Formato,FormatOptions};
assert_eq!("001", 1.formato("000"));
assert_eq!("1,234", 1234.formato("#,###"));
assert_eq!("1,234.56", (1234.5632).formato("N2")); 
assert_eq!("(1,234)", (-1234).formato("#,##0 ;(#,##0);-"));

let ops=FormatOptions::default()
        .with_thousands(" ")
        .with_decimal(",");
assert_eq!("1 234,32", 1234.321.formato_ops("#,###.00",&ops));        

Placeholders

  • "0" replace with digit if there is one otherwise 0
  • "#" replace with digit if there is one else ignore
assert_eq!("001", 1.formato("000"));
assert_eq!("1", 1.formato("###"));
assert_eq!("01", 1.formato("#00"));

Built in formats

where 'd' is the optional number of decimals. when left out, it defaults to 2

  • "Fd": format with fixed number of decimal places
  • "Nd": format with thousand separators and fixed number of decimal places
let num:f64 = 1234.1234;
 assert_eq!("1234.12", num.formato("F"));
 assert_eq!("1234.1", num.formato("F1"));
 assert_eq!("1,234.12", num.formato("N"));
 assert_eq!("1,234.1", num.formato("N1"));

Rounding

where a decimal part is left out, it rounds if the next digit is 5 or above

assert_eq!("1,234.57", 1234.5678.formato("#,###.##"));
assert_eq!("$ 10,000.00", 9999.996.formato("$ #,###.##")); 

Thousands separator

assert_eq!("1,234", 1234.formato("#,###"));

//pattern is repeated for more significant digits
assert_eq!("1,000,000", 1_000_000.formato("#,###"));

//Indian notation - left most pattern is repeated for more significant digits
assert_eq!("10,00,000", 1_000_000.formato("#,##,###"));

Currency and other characters

//formato ignores characters other than #0,. and includes them as is
assert_eq!("$ 1,234.00", 1234.formato("$ #,###.00"));
assert_eq!("oh wow!❤1,234✔", 1234.formato("oh wow!❤#,###✔"));

Custom thousands and decimals

"," sets the grouping location (repeats the last pattern found on int part. decimal part it acts as normal character)

let ops=FormatOptions::default()
        .with_thousands(" ")
        .with_decimal(",");
assert_eq!("1 234,00", 1234.formato_ops("#,###.00",&ops));

Positive, Negative, Zero formats

";" optionally separate positive, negative, zero formats. e.g. 0;(0);-

let my_format = "#,###.00 ;(#,###.00);- ";
assert_eq!("1,234.57 ", 1234.567.formato(my_format));
assert_eq!("(1,234.57)", (-1234.567).formato(my_format));
assert_eq!("- ", 0.formato(my_format));

No runtime deps