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?

Author: razlebe, 2011-02-04

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.

 43
Author: vidstige,
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
  1. 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;
    }
}
  1. 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.

 3
Author: Benny,
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.

 2
Author: AndroidHustle,
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