#[must_use]
pub fn format_float_pg(f: f64) -> String {
if f.is_nan() {
return "NaN".into();
}
if f.is_infinite() {
return if f > 0.0 { "Infinity" } else { "-Infinity" }.into();
}
let sci = format!("{f:e}");
let Some((mantissa, exp)) = sci.split_once('e') else {
return sci;
};
let Ok(exp) = exp.parse::<i32>() else {
return sci;
};
let negative = mantissa.starts_with('-');
let digits: String = mantissa.chars().filter(char::is_ascii_digit).collect();
let sign = if negative { "-" } else { "" };
if (-4..15).contains(&exp) {
if exp >= 0 {
let Ok(int_len) = usize::try_from(exp + 1) else {
return sci;
};
if digits.len() > int_len {
format!("{sign}{}.{}", &digits[..int_len], &digits[int_len..])
} else {
let zeros = "0".repeat(int_len - digits.len());
format!("{sign}{digits}{zeros}")
}
} else {
let Ok(zero_count) = usize::try_from(-exp - 1) else {
return sci;
};
let zeros = "0".repeat(zero_count);
format!("{sign}0.{zeros}{digits}")
}
} else {
let mantissa_text = if digits.len() > 1 {
format!("{}.{}", &digits[..1], &digits[1..])
} else {
digits
};
format!("{sign}{mantissa_text}e{exp:+03}")
}
}