Java Swing – 本地化温度

有没有办法在Java中本地化温度? 像温度格式会根据语言环境?

例如,对于挪威语,温度格式应为14°C。 在度符号之前应该有一个空格。 但其他语言应为14°C。

以下示例演示了温度本地化,包括可自定义的舍入和按区域设置特定属性格式化十进制值。

 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 

这可以通过以下unit testing来validation:

 @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 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); } } 

请注意,按合同规定,所有提供的温度值应具有相同的基本比例(此处为开尔文)。