rust: textutil::si getter for filter

This commit is contained in:
Andy Dixon
2026-10-08 17:17:14 +01:00
parent 0b052bbb6f
commit fc7e94d398
2 changed files with 7 additions and 3 deletions
+1 -2
View File
@@ -375,8 +375,7 @@ fn split_num(s: &str) -> (&str, &str) {
pub fn parse_size(s: &str) -> Result<i64, String> { pub fn parse_size(s: &str) -> Result<i64, String> {
let (num, unit_raw) = split_num(s); let (num, unit_raw) = split_num(s);
let Ok(v) = num.parse::<f64>() else { return Err(format!("bad size {s:?}")) }; let Ok(v) = num.parse::<f64>() else { return Err(format!("bad size {s:?}")) };
// ponytail: textutil exposes no SI getter; its formatting reveals the setting. let bare: f64 = if crate::textutil::si() { 1000.0 } else { 1024.0 };
let bare: f64 = if crate::textutil::size(1000).ends_with("kB") { 1000.0 } else { 1024.0 };
let m = match unit_raw.trim().to_lowercase().as_str() { let m = match unit_raw.trim().to_lowercase().as_str() {
"" | "b" => 1.0, "" | "b" => 1.0,
"k" => bare, "k" => bare,
+6 -1
View File
@@ -162,11 +162,16 @@ pub fn set_si(v: bool) {
SI.store(v, Ordering::Relaxed); SI.store(v, Ordering::Relaxed);
} }
/// Whether decimal units are selected.
pub fn si() -> bool {
SI.load(Ordering::Relaxed)
}
const IEC_UNITS: [&str; 7] = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"]; const IEC_UNITS: [&str; 7] = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"];
const SI_UNITS: [&str; 7] = ["B", "kB", "MB", "GB", "TB", "PB", "EB"]; const SI_UNITS: [&str; 7] = ["B", "kB", "MB", "GB", "TB", "PB", "EB"];
fn scaled(n: i64) -> (f64, &'static str) { fn scaled(n: i64) -> (f64, &'static str) {
let (base, units) = if SI.load(Ordering::Relaxed) { (1000.0, &SI_UNITS) } else { (1024.0, &IEC_UNITS) }; let (base, units) = if si() { (1000.0, &SI_UNITS) } else { (1024.0, &IEC_UNITS) };
let neg = n < 0; let neg = n < 0;
let mut v = (n as f64).abs(); let mut v = (n as f64).abs();
let mut i = 0; let mut i = 0;