Numeric conversions for engineering notation and the RKM code variant.
In engineering applications it is common to express quantities relative to the next-lower power of 1000, described by an SI (metric) prefix.
For example:
| Number | Engineering | RKM |
|---|---|---|
| 42 | 42 | 42 |
| 999 | 999 | 999 |
| 1000 | 1k | 1k |
| 1500 | 1.5k | 1k5 |
| 42900 | 42.9k | 42k9 |
| 2340000 | 2.34M | 2M34 |
And so on going up the SI prefixes, including the new ones R (1027) and Q (1030) which were added in 2022.
Overview
This crate is centred around the EngineeringQuantity type.
The intended use case is reading user-entered strings from configuration files.
- When using
EngineeringQuantityyou must specify the storage parameter type to use. This can be any primitive integer except fori8oru8. - Conversion from string autodetects both standard and RKM code variants.
- An
EngineeringQuantitymay be converted to/from most primitive integer types. - You can convert directly to string, or via the
DisplayAdaptertype for more control. - Primitive integers may be converted directly to string via the
EngineeringReprconvenience trait.
Or, if you prefer, here are the type relations in diagram form:
╭─────────────────────╮ ╭─────────────────────╮ ╭───────────╮
│ integers │ │ integer types │ │ raw tuple │
│ (i16/u16 or larger) │ │ (where Into<T>) │ │ (T, i8) │
╰─────────────────────╯ ╰─────────────────────╯ ╰───────────╯
╵ ▲ │ ▲
╵ │ TryFrom │ From │ From
╵ │ ▼ ▼
╵ ┌───────────────────────────────────────────────────────────┐
╵ │ EngineeringQuantity<T> │
╵ └───────────────────────────────────────────────────────────┘
╵ │ ▲ │
╵ ┌─────────────────────┐ │ │ │
╵ impl │ EngineeringRepr │ │ (configurable │ FromStr │ Display
└−−−−−▶ │ (convenience trait) │ │ format) │ │
└─────────────────────┘ │ │ │
│ to_eng(), to_rkm() │ │ │
▼ │ │ │
┌─────────────────────┐ │ │ │
│ DisplayAdapter<T> │ ◀──┘ │ │
└─────────────────────┘ │ │
│ Display │ │
▼ │ │
╭─────────────────────╮ │ │
│ String │ ─────────────────────┘ │
╰─────────────────────╯ ◀───────────────────────────────┘
Examples
String to number
use EngineeringQuantity as EQ;
use FromStr as _;
// Standard notation
let eq = EQ::from_str.unwrap;
assert_eq!;
// RKM style notation
let eq2 = EQ::from_str.unwrap;
assert_eq!;
Number to string
use EngineeringQuantity as EQ;
// default precision (3 places)
let ee1 = EQ::from;
assert_eq!;
// explicit precision
let ee2 = EQ::from;
assert_eq!;
// RKM style
assert_eq!;
// Zero precision means "automatic, lossless"
assert_eq!;
assert_eq!;
Convenience trait
use EngineeringRepr as _;
assert_eq!;
assert_eq!; // automatic precision
assert_eq!;
Limitations
- This crate only supports integers at the present time. The smaller multipliers (m, μ, n, p, f, a, z, y, r, q) are not supported.
- Multipliers which are not a power of 1000 (da, h, d, c) are not supported.
Alternatives
- human-repr is great for converting numbers to human-friendly representations.
- humanize-rs is great for converting some human-friendly representations to numbers, though engineering-repr offers more flexibility.