j1939_async/
string_utils.rs1use heapless::String;
2
3pub fn format_number(
4 val: f32,
5 mult: &str,
6 unit: &str,
7 max_len: usize,
8 precision: usize,
9) -> String<12> {
10 let mut string: String<12>;
11 use lexical_core::BUFFER_SIZE;
12
13 let mut buffer = [b'0'; BUFFER_SIZE];
14 let bytes = lexical_core::write(val, &mut buffer);
15 string = match core::str::from_utf8(bytes).unwrap().try_into() {
16 Ok(s) => s,
17 Err(_) => String::try_from("ErRoR").unwrap(),
18 };
19
20 let max_num_len = max_len - mult.len() - unit.len();
21
22 match string.find('.') {
23 Some(dp_pos) => {
24 let len_by_precision = dp_pos + precision + 1;
25 let target_len = core::cmp::min(len_by_precision, max_num_len);
26 while string.len() < target_len {
27 _ = string.push('0');
28 }
29 string.truncate(target_len);
30 }
38 None => {}
39 }
40
41 _ = string.push_str(mult);
47 _ = string.push_str(unit);
48 string
49}
50
51#[test]
55fn test_format_numer() {
56 assert_eq!(format_number(100.23, "m", "A", 8, 2), "100.23mA");
57 assert_eq!(format_number(100.0, "m", "A", 8, 2), "100.00mA");
58 assert_eq!(format_number(10.0, "m", "A", 8, 2), "10.00mA");
59 assert_eq!(format_number(1.0, "m", "A", 8, 2), "1.00mA");
60}
61