pub fn format_i32(buffer: &mut [u8], n: i32) -> &str {
format_i32_padded(buffer, n, 0, '0')
}
pub fn format_i32_padded(buffer: &mut [u8], mut n: i32, length: usize, placeholder: char) -> &str {
let mut m = 0; let mut j = 0; let mut k = 0;
if n < 0 {
n *= -1;
buffer[0] = b'-';
j = 1;
}
if n == 0 {
buffer[j + k] = b'0';
k += 1;
} else {
while n > 0 {
let digit = (n % 10) as u8;
n /= 10;
let digit = char::from_u32(digit as u32 + '0' as u32).unwrap();
buffer[j + k] = digit as u8;
k += 1;
}
}
for i in 0..(k / 2) {
buffer.swap(i + j, k + j - i - 1);
}
if length > k {
m = length - k - j;
for i in 0..(j + k) {
buffer[(j + k - i - 1) + m] = buffer[j + k - i - 1];
}
#[allow(clippy::needless_range_loop)]
for i in 0..m {
buffer[i] = placeholder as u8;
}
}
unsafe { core::str::from_utf8_unchecked(&buffer[..(m + j + k)]) }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_format_i32_0() {
let n = 0;
let mut buffer = [0; 10];
let text = format_i32(&mut buffer, n);
let expected = "0";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_5() {
let n = 5;
let mut buffer = [0; 10];
let text = format_i32(&mut buffer, n);
let expected = "5";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_minus_5() {
let n = -5;
let mut buffer = [0; 10];
let text = format_i32(&mut buffer, n);
let expected = "-5";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_23() {
let n = 23;
let mut buffer = [0; 10];
let text = format_i32(&mut buffer, n);
let expected = "23";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_100() {
let n = 100;
let mut buffer = [0; 10];
let text = format_i32(&mut buffer, n);
let expected = "100";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_padded_5() {
let n = 5;
let mut buffer = [0; 10];
let text = format_i32_padded(&mut buffer, n, 5, '0');
let expected = "00005";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_padded_23() {
let n = 23;
let mut buffer = [0; 10];
let text = format_i32_padded(&mut buffer, n, 5, ' ');
let expected = " 23";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_padded_100() {
let n = 100;
let mut buffer = [0; 10];
let text = format_i32_padded(&mut buffer, n, 5, '.');
let expected = "..100";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_padded_minus_5() {
let n = -5;
let mut buffer = [0; 10];
let text = format_i32_padded(&mut buffer, n, 5, '0');
let expected = "000-5";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_padded_minus_23() {
let n = -23;
let mut buffer = [0; 10];
let text = format_i32_padded(&mut buffer, n, 5, ' ');
let expected = " -23";
assert_eq!(text, expected);
}
#[test]
fn test_format_i32_padded_minus_100() {
let n = -100;
let mut buffer = [0; 10];
let text = format_i32_padded(&mut buffer, n, 5, '.');
let expected = ".-100";
assert_eq!(text, expected);
}
}