Java Swing - Localize Temperature

后端 未结 1 1789
天命终不由人
天命终不由人 2021-02-08 03:38

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

1条回答
  •  灰色年华
    2021-02-08 03:57

    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 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).

    0 讨论(0)
提交回复
热议问题