32

長さをセンチメートル(cm)またはインチ( ")で表示したいアプリに取り組んでいます。ロケールから適切な単位を選択する方法はありますか?いずれにしても、ユーザーがロケール設定を上書きできるようにするオプション。

米国、リベリア、およびビルマは、帝国単位とその他の世界の通常の単位を使用する必要があります。1つの方法は、このロジックを自分のクラスに配置することですが、可能な場合は、組み込みのロジックを使用することをお勧めします。ポインタはありますか?

4

6 に答える 6

51

結局、私は次の解決策に行きました。

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

例えばこんな使い方。

if (UnitLocale.getDefault() == UnitLocale.Imperial) convertToimperial();

convert メソッドも必要な場合は、できれば UnitLocale のサブクラスに追加できます。帝国単位を使用するかどうかを検出してサーバーに送信するだけで済みました。

Java オブジェクトに対して s を使用intすると、パフォーマンスが大幅に向上し、コードが読みにくくなります。Java で 2 つの参照を比較する速度は、2 つの を比較する速度に匹敵しintsます。UnitLocaleまた、オブジェクトを使用すると、convertToMetric などのメソッドをクラスまたはサブクラスに追加できます。

必要に応じて、代わりに列挙型を使用することもできます。

于 2011-10-22T16:09:32.967 に答える
6

LocaleData.getMeasurementSystemは、API レベル 28 以降で使用できます。探している情報を返します。

于 2020-04-16T04:43:17.260 に答える
4
  1. プログラムによる

@vidstige のソリューションを少し改善する

安全のために getCountry().toUpperCase() を使用し、チェックをスイッチに変更してよりクリーンなコードにします。このようなもの:

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. リソースから

別の解決策として、[values_US] [values_LR] [values_MM] のような各国のリソース フォルダーを作成し、ブール値のリソースを true に変更することもできます。次に、そのブール リソースをコードから読み取ります。

于 2016-11-22T01:19:27.217 に答える
2

設定メニューで好みの単位を選択するオプションをユーザーに与えるだけです。旅行中のユーザーの場合、アプリが地理的に認識したくない場合は、IMO.

于 2011-02-04T13:08:44.493 に答える