j1939_async/
string_utils.rs

1use 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            // 10.12
31            // dp is at 2,  len = 5, prec = 5 - 2 - 1 = 2
32            /*let precision = string.len()
33            let target_by_dp =
34            if string.len() > len {
35                string.truncate(core::cmp::max(len, dp_pos));
36            }*/
37        }
38        None => {}
39    }
40
41    //let len = core::cmp::min(len - mult.len() - unit.len(), utf8.len());
42
43    //let len = core::cmp::min(len - mult.len() - unit.len(), utf8.len());
44    //string = utf8[0..len].into();
45
46    _ = string.push_str(mult);
47    _ = string.push_str(unit);
48    string
49}
50
51//#[cfg(test)]
52//mod format_number_Tests {
53
54#[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//}