Correct sub-unit scale application
This commit is contained in:
parent
a4ee749251
commit
a4d913d772
1 changed files with 20 additions and 12 deletions
|
|
@ -4484,16 +4484,20 @@ fn alternate_units_text(measurement: f64, style: Option<&DimStyle>) -> Option<St
|
||||||
if !s.dimalt {
|
if !s.dimalt {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let mut v = measurement * s.dimaltf;
|
let scaled = measurement * s.dimaltf;
|
||||||
|
let use_sub_units = s.dimaltz & 4 != 0
|
||||||
|
&& scaled.abs() < 1.0
|
||||||
|
&& s.dimaltmzf.abs() > 1e-12;
|
||||||
|
// DIMALTMZF replaces the ordinary alternate-unit factor for sub-unit
|
||||||
|
// values; it is not an additional multiplier.
|
||||||
|
let mut v = if use_sub_units {
|
||||||
|
measurement * s.dimaltmzf
|
||||||
|
} else {
|
||||||
|
scaled
|
||||||
|
};
|
||||||
if s.dimaltrnd > 1e-12 {
|
if s.dimaltrnd > 1e-12 {
|
||||||
v = (v / s.dimaltrnd).round() * s.dimaltrnd;
|
v = (v / s.dimaltrnd).round() * s.dimaltrnd;
|
||||||
}
|
}
|
||||||
let use_sub_units = s.dimaltz & 4 != 0
|
|
||||||
&& v.abs() < 1.0
|
|
||||||
&& s.dimaltmzf.abs() > 1e-12;
|
|
||||||
if use_sub_units {
|
|
||||||
v *= s.dimaltmzf;
|
|
||||||
}
|
|
||||||
let dec = s.dimaltd.max(0) as usize;
|
let dec = s.dimaltd.max(0) as usize;
|
||||||
let raw = format_with_unit(v, s.dimaltu, dec, s.dimfrac, s.dimaltz, true);
|
let raw = format_with_unit(v, s.dimaltu, dec, s.dimfrac, s.dimaltz, true);
|
||||||
let suppressed = apply_linear_zero_suppression(&raw, s.dimaltz);
|
let suppressed = apply_linear_zero_suppression(&raw, s.dimaltz);
|
||||||
|
|
@ -4659,14 +4663,18 @@ fn format_linear_value(measurement: f64, style: Option<&DimStyle>) -> String {
|
||||||
.unwrap_or((4, 8, 1.0, 0.0, 46, 2, 0, 1.0, ""));
|
.unwrap_or((4, 8, 1.0, 0.0, 46, 2, 0, 1.0, ""));
|
||||||
|
|
||||||
let lfac = if lfac.abs() < 1e-12 { 1.0 } else { lfac };
|
let lfac = if lfac.abs() < 1e-12 { 1.0 } else { lfac };
|
||||||
let mut v = measurement * lfac;
|
let scaled = measurement * lfac;
|
||||||
|
let use_sub_units = zin & 4 != 0 && scaled.abs() < 1.0 && sub_factor.abs() > 1e-12;
|
||||||
|
// For values below one unit, DIMMZF replaces DIMLFAC; applying it after
|
||||||
|
// DIMLFAC multiplies both factors and reports the wrong sub-unit value.
|
||||||
|
let mut v = if use_sub_units {
|
||||||
|
measurement * sub_factor
|
||||||
|
} else {
|
||||||
|
scaled
|
||||||
|
};
|
||||||
if rnd > 1e-12 {
|
if rnd > 1e-12 {
|
||||||
v = (v / rnd).round() * rnd;
|
v = (v / rnd).round() * rnd;
|
||||||
}
|
}
|
||||||
let use_sub_units = zin & 4 != 0 && v.abs() < 1.0 && sub_factor.abs() > 1e-12;
|
|
||||||
if use_sub_units {
|
|
||||||
v *= sub_factor;
|
|
||||||
}
|
|
||||||
let dec = dec.max(0) as usize;
|
let dec = dec.max(0) as usize;
|
||||||
let raw = format_with_unit(v, lunit, dec, frac, zin, false);
|
let raw = format_with_unit(v, lunit, dec, frac, zin, false);
|
||||||
let suppressed = apply_linear_zero_suppression(&raw, zin);
|
let suppressed = apply_linear_zero_suppression(&raw, zin);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue