use heapless::String;
pub fn format_number(
val: f32,
mult: &str,
unit: &str,
max_len: usize,
precision: usize,
) -> String<12> {
let mut string: String<12>;
use lexical_core::BUFFER_SIZE;
let mut buffer = [b'0'; BUFFER_SIZE];
let bytes = lexical_core::write(val, &mut buffer);
string = match core::str::from_utf8(bytes).unwrap().try_into() {
Ok(s) => s,
Err(_) => String::try_from("ErRoR").unwrap(),
};
let max_num_len = max_len - mult.len() - unit.len();
match string.find('.') {
Some(dp_pos) => {
let len_by_precision = dp_pos + precision + 1;
let target_len = core::cmp::min(len_by_precision, max_num_len);
while string.len() < target_len {
_ = string.push('0');
}
string.truncate(target_len);
}
None => {}
}
_ = string.push_str(mult);
_ = string.push_str(unit);
string
}
#[test]
fn test_format_numer() {
assert_eq!(format_number(100.23, "m", "A", 8, 2), "100.23mA");
assert_eq!(format_number(100.0, "m", "A", 8, 2), "100.00mA");
assert_eq!(format_number(10.0, "m", "A", 8, 2), "10.00mA");
assert_eq!(format_number(1.0, "m", "A", 8, 2), "1.00mA");
}