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).
ResourceBundle
andMessageFormat
should work . Also have a look here, maybe this could help you : openjavaweatherapi.sourceforge.net/javadoc/com/oopitis/weather/… – Scour