-
public final class MeasurementWheelKt
-
-
Method Summary
Modifier and Type Method Description final static DoublemeasurementRoundHalfAway(Double x)Pinned half-away-from-zero rounding: sign(x) * floor(abs(x) + 0.5).final static DoublemeasurementSnap(Double value, MeasurementUnit unit)Snap a value to unit.step/unit.decimals, THEN clamp to[unit.min, unit.max].final static DoublemeasurementToBase(Double value, MeasurementUnit unit)Convert a value expressed in unitto the canonical base:(value - offset) / factor.final static DoublemeasurementFromBase(Double base, MeasurementUnit unit)Convert a base value into unit:base * factor + offset.final static ObjectmeasurementScalar(Double v)Persist as a whole integer ( Long, mirroring the legacy drum'sif (v == v.toLong().toDouble()) v.toLong() else vat ContentBlockRenderer.final static MeasurementSnapshotmeasurementSnapshot(String fieldId, Double base, MeasurementUnit baseUnit, MeasurementUnit displayUnit)final static MeasurementConfigparseMeasurementConfig(ContentBlock block)Parse + validate the measurement config. -
-
Method Detail
-
measurementRoundHalfAway
final static Double measurementRoundHalfAway(Double x)
Pinned half-away-from-zero rounding:
sign(x) * floor(abs(x) + 0.5). The ONE algorithm shared across iOS/Android/JS — it deliberately does NOT use Kotlin'sMath.round/roundToLong(which is half-up, differs on negatives) so negatives match Swift/JS.sign(0) == 0.
-
measurementSnap
final static Double measurementSnap(Double value, MeasurementUnit unit)
Snap a value to
unit.step/unit.decimals, THEN clamp to[unit.min, unit.max]. Clamp is the FINAL op and usesmin(max(d,lo),hi)(never KotlincoerceIn, which throws onlo > hi) so non-step-aligned custom ranges still land on the boundary.
-
measurementToBase
final static Double measurementToBase(Double value, MeasurementUnit unit)
Convert a value expressed in
unitto the canonical base:(value - offset) / factor.
-
measurementFromBase
final static Double measurementFromBase(Double base, MeasurementUnit unit)
Convert a base value into
unit:base * factor + offset.
-
measurementScalar
final static Object measurementScalar(Double v)
Persist as a whole integer (
Long, mirroring the legacy drum'sif (v == v.toLong().toDouble()) v.toLong() else vat ContentBlockRenderer.kt:5674) when whole,Doubleotherwise. Keepsanswer_equalsnumeric routing consistent.
-
measurementSnapshot
final static MeasurementSnapshot measurementSnapshot(String fieldId, Double base, MeasurementUnit baseUnit, MeasurementUnit displayUnit)
-
parseMeasurementConfig
final static MeasurementConfig parseMeasurementConfig(ContentBlock block)
Parse + validate the measurement config. Returns
null(→ legacy drum fallback) whenmeasurement_typeis unset,unitsis empty/unresolvable, or ANY unit is degenerate (factor==0,step<=0,min>=max). Aunit_defaultthat matches no unit is NOT a fallback trigger — it resolves tounits[0]and stays in measurement mode.
-
-
-
-