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).
Czy jest to tylko spacja, czy też mogą występować miejscowe, które będą wyświetlać odpowiednie ° F? – Fildor
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
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