Formatting and Parsing
Formatter classes turn measurements into text and parse text back into measurement objects.
They extend MeasureFormatter, which wraps Java’s NumberFormat and therefore honors locale-specific decimal separators, grouping, rounding, and parse rules.
Format a measurement
import com.irurueta.units.Distance;
import com.irurueta.units.DistanceFormatter;
import com.irurueta.units.DistanceUnit;
DistanceFormatter formatter = new DistanceFormatter();
formatter.setMaximumFractionDigits(2);
String text = formatter.format(new Distance(5.5, DistanceUnit.METER));
String raw = formatter.format(2500.0, DistanceUnit.MILLIMETER);
By default, value and unit are combined with the pattern {0} {1}.
You can change it when an application needs another layout.
formatter.setValueAndUnitFormatPattern("{0}{1}");
String compact = formatter.format(5.5, DistanceUnit.METER);
Choose metric or imperial display
Formatters can convert to a suitable unit before formatting.
Pass UnitSystem.METRIC or UnitSystem.IMPERIAL when you want deterministic output.
import com.irurueta.units.DistanceFormatter;
import com.irurueta.units.DistanceUnit;
import com.irurueta.units.UnitSystem;
DistanceFormatter formatter = new DistanceFormatter();
formatter.setMaximumFractionDigits(1);
String metric = formatter.formatAndConvert(
1500.0,
DistanceUnit.METER,
UnitSystem.METRIC);
String imperial = formatter.formatAndConvert(
1500.0,
DistanceUnit.METER,
UnitSystem.IMPERIAL);
When no unit system is passed, the formatter uses the unit system inferred from its locale.
UnitLocale maps the United States, Liberia, and Myanmar/Burma to imperial; other locales default to metric.
The Javadocs note that locale detection is approximate, so applications should let users override it when the choice matters.
Locale-aware parsing
import com.irurueta.units.Distance;
import com.irurueta.units.DistanceFormatter;
import java.text.ParseException;
import java.util.Locale;
DistanceFormatter formatter = new DistanceFormatter(Locale.US);
Distance parsed = formatter.parse("12.5 ft");
boolean hasKnownUnit = formatter.isValidUnit("12.5 ft");
boolean isMeasurement = formatter.isValidMeasurement("12.5 ft");
Parsing can throw ParseException when the numeric value cannot be read and UnknownUnitException when the unit symbol is not recognized.