2017-01-09 20 views
10

Czy istnieje sposób na lokalizację temperatury w Javie? Podobnie jak format temperatury będzie oparty na locale?Java Swing - lokalizowanie temperatury

Ponieważ na przykład dla języka norweskiego format temperatury powinien wynosić 14 ° C. Powinno być wolne miejsce przed symbolem stopni. Ale inne języki powinny wynosić 14 ° C.

+0

Czy jest to tylko spacja, czy też mogą występować miejscowe, które będą wyświetlać odpowiednie ° F? – Fildor

+3

Należy użyć połączenia 'ResourceBundle' i' MessageFormat'. Zajrzyj tutaj, może to może ci pomóc: http://openjavaweatherapi.sourceforge.net/javadoc/com/oopitis/weather/WeatherProperty.html – Berger

+0

Prosty przełącznik do listy każdego użytkownika Fahrenheita, aby przekonwertować żądaną wartość. Co do reszty, użyj Celsjusza, nie ma zbyt wielu krajów, które go używają. Zobacz [post] (https://www.quora.com/Which-countries-use-Fahrenheit-as-a-ourcement-of-perperature), aby zobaczyć listę – AxelH

Odpowiedz

7

Poniższy przykład ilustruje lokalizację temperatury, w tym konfigurowalne zaokrąglanie i formatowanie wartości dziesiętnych według właściwości specyficznych dla ustawień narodowych.

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 

Można to sprawdzić w następujących testach: jednostkę

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

Należy zauważyć, że na podstawie umowy, wszystkie przewidziane wartości temperatury powinien mieć taką samą skalę bazową (tutaj to Kelvin).

+0

Chciałbym użyć TempLocal, który użyje ustawień regionalnych i użyje go do konwersji wartości. Ponieważ lista użytkowników F ° jest ograniczona, mogę ją zmienić. Będzie to łatwiejsze niż pisanie jednego pliku na kraj. Zobacz [post] (https://www.quora.com/Which-countries-use-Fahrenheit-as-aasurement-of-perperature), aby zobaczyć, jak krótki może być przełącznik – AxelH

+0

@AxelH OP odnosi się do wielojęzyczna aplikacja, która prawdopodobnie używa już plików właściwości dla każdego obsługiwanego języka. Wyświetlany ciąg temperatury może różnić się bardziej aspektami niż tylko wartość konwersji lokalnej skali. –

+1

Widzę, że bardziej jak format numeryczny używany przez Javę, a nie jak aplikacja wielojęzyczna, ale nie wiem. – AxelH