[](https://crates.io/crates/format_num_pattern)
[](https://docs.rs/format_num_pattern)
[](https://opensource.org/licenses/MIT)
[](https://www.apache.org/licenses/LICENSE-2.0)

# Number formatting
This one uses a pattern string instead of the `format!` style.
## Localization
Localization is done with [NumberSymbols].
The locale-data is provided by [pure_rust_locales](https://crates.io/crates/pure-rust-locales).
## Requirements
A number for this library is any type that is `LowerExp` + `Display`.
The conversion to string is done via `format!("{}")` and `format!("{:e}")`,
this string is split at '.' and 'e' and pattern is applied.
The digits themselves are not validated to safe time.
Parsing needs `FromStr`.
* `parse_sym()` only takes the symbols and removes everything from the
input, that is not a digit or the decimal-separator. The result is handed
to `FromStr`.
* `parse_fmt()` takes a `NumberFormat` and requires an exact match for
the pattern. The recognized parts are reassembled in the correct order
and handed to `FromStr`.
## Example
```
use format_num_pattern::Locale::de_AT_euro;
use format_num_pattern as num;
use format_num_pattern::{NumberFormat, NumberSymbols};
// formats accordingly, uses the default symbols.
let s = num::format(4561.2234, "###,##0.00").expect("works");
assert_eq!(s, " 4,561.22");
// uses symbols
let sym = NumberSymbols::monetary(de_AT_euro);
let s = num::formats(4561.2234, "$ ###,##0.00", &sym).expect("works");
assert_eq!(s.as_str(), "€ 4\u{202f}561,22");
// prepared format
let sym = NumberSymbols::monetary(de_AT_euro);
let m2 = NumberFormat::news("$ ###,##0.00", sym).expect("works");
let s = m2.fmt(4561.2234).expect("works");
assert_eq!(s.as_str(), "€ 4\u{202f}561,22");
// postfix fmt using the FormatNumber trait
use format_num_pattern::DisplayNumber;
println!("combined output: {}", 4561.2234f64.fmt(&m2));
```
## Patterns
The following patterns are recognized:
* `0` - digit or 0
* `9` - digit or space
* `#` - digit or sign or space
* `-` - sign; show space for positive
* `+` - sign; show '+' for positive and '-' for negative. not localized.
* `.` - decimal separator
* `:` - decimal separator, always shown
* `,` - grouping separator. Might be completely absent, if the FormatSymbols say so.
* `E` - upper case exponent
* `e` - lower case exponent
* ` ` - space can be used as separator
* '$' - currency. variable length output according to the currency-symbol.
* `\` - all ascii characters (ascii 32-128!) are reserved and must be escaped.
* `_` - other unicode characters can be used without escaping.
## Performance
The simple benchmark that I ran gives a time of
* 1.68 x format!
* 3.5 x ryu