2017-01-09 17 views
10

Javaで温度をローカライズする方法はありますか?温度のようなフォーマットはロケールに基づいていますか?Java Swing - 温度のローカライズ

たとえば、ノルウェー語の場合、温度の形式は14℃にする必要があります。シンボルの前にスペースが必要です。しかし、他の言語は14°Cでなければなりません。

+0

ちょうどスペースか、対応する°Fを表示するロケールがありますか? – Fildor

+3

'ResourceBundle'と' MessageFormat'の組み合わせを使うとうまくいくはずです。また、ここを見て、おそらくこれはあなたを助けるかもしれません:http://openjavaweatherapi.sourceforge.net/javadoc/com/oopitis/weather/WeatherProperty.html – Berger

+0

あなたが望む値を変換するすべての華氏のユーザをリストする簡単なスイッチ。残りの人は、摂氏を使用してください。まだそれを使用している国はたくさんありません。リストを見るにはこの[post](https://www.quora.com/Which-countries-use-Fahrenheit-as-a-measurement-of-temperature)を参照してください – AxelH

答えて

7

次の例は、ロケール固有のプロパティによる10進値のカスタマイズ可能な丸めと書式設定を含む、温度のローカライゼーションを示しています。

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 

これは、次のユニットテストにより確認することができます。

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

契約によって、すべての提供される温度値は同じベーススケール(ここではケルビン)でなければなりません。

+0

私はLocaleを使用するTempLocalを使用し、代わりに値を変換するために使用します。 F°ユーザのリストは限られているので、私はそれを行うことができます。これは国ごとに1つのファイルを書くよりも簡単になります。このスイッチがどれくらい短くてよいかを知るには、この[post](https://www.quora.com/Which-countries-use-Fahrenheit-as-a-measurement-of-temperature)を参照してください。 – AxelH

+0

@AxelH OPは、サポートされている言語ごとにプロパティファイルを既に使用している多言語アプリケーションです。表示される温度ストリングは、ローカルスケールの変換値だけではなく、さまざまな面で異なる場合があります。 –

+1

私は多言語アプリケーションのようにではなく、Javaでの数値形式の使用に似ていますが、わかりません。 – AxelH