Is there a way to localize Temperature in Java? Like temperature format will be based on the locale?
Because for example, for Norwegian language temperature format shoul
The following example demonstrates temperature localization, including customizable rounding and formatting of decimal values by locale specific properties.
public class LocalTemperature {
private final Locale locale;
private final String temperatureFormat;
private final float conversionFactor;
private final float conversionOffset;
public LocalTemperature(ResourceBundle bundle) {
locale = bundle.getLocale();
temperatureFormat = bundle.getString("temperature.decimal.format");
conversionFactor = Float.parseFloat(bundle.getString("temperature.conversion.factor"));
conversionOffset = Float.parseFloat(bundle.getString("temperature.conversion.offset"));
}
public String format(double kelvin) {
double localTemperature = conversionOffset + conversionFactor * kelvin;
DecimalFormat format = new DecimalFormat(temperatureFormat, DecimalFormatSymbols.getInstance(locale));
return format.format(localTemperature);
}
}
MyResources_DE.properties:
temperature.conversion.factor=1.0
temperature.conversion.offset=-273.15
temperature.decimal.format=###,###.##°C
MyResources_NR.properties:
temperature.conversion.factor=1.0
temperature.conversion.offset=-273.15
temperature.decimal.format=###,###.## °C
MyResources_en_US.properties:
temperature.conversion.factor=1.8
temperature.conversion.offset=-459.67
temperature.decimal.format=###,###.## °F
This can be verified by the following unit test:
@RunWith(Parameterized.class)
public class LocalTemperatureTest {
private final double testValue;
private final String expectedResult;
private final LocalTemperature testSubject;
public LocalTemperatureTest(Locale locale, double testValue, String expected) {
ResourceBundle bundle = ResourceBundle.getBundle("MyResources", locale);
this.testSubject = new LocalTemperature(bundle);
this.testValue = testValue;
this.expectedResult = expected;
}
@Test
public void test() {
TestCase.assertEquals("Conversion error", expectedResult, testSubject.format(testValue));
}
@Parameters(name="{index}: locale={0} kelvin={1} expected={2}")
public static Iterable
Note that by contract, all provided temperature values should have the same base scale (here it's kelvin).