Używanie ustawień lokalnych do wykrywania, kto ma używać jednostek imperialnych
Pracuję nad aplikacją, która chce wyświetlać długości w centymetrach (cm) lub w calach ("). Czy istnieje sposób, aby wybrać odpowiednią jednostkę z ustawień regionalnych? W każdym razie mam zamiar również umieścić w opcji tak, że użytkownik może zastąpić ustawienia regionalne.
USA, Liberia i Birma powinny używać jednostek imperialnych, a reszta świata normalnych jednostek. Jednym ze sposobów jest umieszczenie tej logiki w moich własnych klasach, ale wolałbym używać dowolnej wbudowanej logiki, jeśli jest dostępna. Jakieś wskazówki?
3 answers
W końcu zdecydowałem się na następujące rozwiązanie.
public class UnitLocale {
public static UnitLocale Imperial = new UnitLocale();
public static UnitLocale Metric = new UnitLocale();
public static UnitLocale getDefault() {
return getFrom(Locale.getDefault());
}
public static UnitLocale getFrom(Locale locale) {
String countryCode = locale.getCountry();
if ("US".equals(countryCode)) return Imperial; // USA
if ("LR".equals(countryCode)) return Imperial; // Liberia
if ("MM".equals(countryCode)) return Imperial; // Myanmar
return Metric;
}
}
Użyj go tak na przykład.
if (UnitLocale.getDefault() == UnitLocale.Imperial) convertToimperial();
Jeśli metody konwersji są również potrzebne, mogą być dodane do podklas UnitLocale. Potrzebowałem tylko wykryć gdzie użyć jednostek imperialnych i wysłać je na serwer.
Używanie int
s nad obiektami Javy ma niezwykle niewielki wzrost wydajności i sprawia, że kod jest trudniejszy do odczytania. Porównywanie dwóch odwołań w Javie jest porównywalne pod względem szybkości do porównywania dwóch ints
. Również użycie obiektów pozwala nam dodawać metody do klasy UnitLocale
lub podklas, takich jak, convertToMetric, itp.
Możesz również użyć enum, jeśli wolisz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 14:45:10
- programowo
Dokonywanie niewielkiej poprawy w roztworze z @ vidstige
Użyłbym getCountry ().toUpperCase () aby było bezpieczne i zmienić sprawdzanie na przełącznik dla kodu cleaner. Coś takiego:
public static UnitLocale getFrom(Locale locale) {
String countryCode = locale.getCountry().toUpperCase();
switch (countryCode) {
case "US":
case "LR":
case "MM":
return Imperial;
default:
return Metric;
}
}
- Z Zasobów
Innym rozwiązaniem może być tworzenie folderów zasobów dla każdego kraju, takich jak: [values_US] [values_LR] [values_MM] z zasobem logicznym zmienionym na true. Następnie przeczytaj ten zasób logiczny z kod.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 01:19:27
Wystarczy dać użytkownikowi opcję wyboru preferowanego urządzenia w menu ustawień. Jeśli jest to użytkownik podróżujący, nie chcesz, aby aplikacja była świadoma geograficznie, IMO.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-04 13:08:44