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 should be 14 °C. There should be a space before degrees symbol. But other languages should be 14°C.
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<Object[]> getTestParameters() {
Locale norwegian = new Locale("nr");
Object[][] parameters = {
{Locale.GERMAN, 0, "-273,15°C"},
{Locale.GERMAN, 273.15, "0°C"},
{Locale.GERMAN, 287.15, "14°C"},
{Locale.GERMAN, 287.35, "14,2°C"},
{Locale.GERMAN, 287.38, "14,23°C"},
{Locale.GERMAN, 287.384, "14,23°C"},
{Locale.GERMAN, 287.385, "14,24°C"},
{norwegian, 287.15, "14 °C"},
{Locale.US, 300.0, "80.33 °F"}
};
return Arrays.asList(parameters);
}
}
Note that by contract, all provided temperature values should have the same base scale (here it's kelvin).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With