5

NSLengthFormatterクラスを使用して、ユーザーと目的地の間の距離をフォーマットしています。

CLLocation *userLocation; //<- Coordinates fetched from CLLocationManager
CLLocation *targetLocation; //<- Some location retrieved from server data

CLLocationDistance distance = [userLocation distanceFromLocation:targetLocation];

NSLengthFormatter *lengthFormatter = [NSLengthFormatter new];
NSString *formattedLength = [lengthFormatter stringFromMeters:distance];

現在、長さが 1000 メートル未満の場合、フォーマットされた距離は常にヤードまたはメートルで表示されます (ロケールによって異なります)。

例えば。距離 = 450.0 の場合、フォーマットされた文字列は 492.7 ヤードまたは 450 m になります。

NSLengthFormatter を微調整して距離文字列をマイル/キロメートルのみで返すにはどうすればよいですか?

4

4 に答える 4

10

これは私が最終的に使用したものです:

-(NSString *)formattedDistanceForMeters:(CLLocationDistance)distance
 {
    NSLengthFormatter *lengthFormatter = [NSLengthFormatter new];
    [lengthFormatter.numberFormatter setMaximumFractionDigits:1];

    if ([[[NSLocale currentLocale] objectForKey:NSLocaleUsesMetricSystem] boolValue])
    {
        return [lengthFormatter stringFromValue:distance / 1000 unit:NSLengthFormatterUnitKilometer];
    }
    else
    {
        return [lengthFormatter stringFromValue:distance / 1609.34 unit:NSLengthFormatterUnitMile];
    }
}

編集:

Swift での同じものは次のようになります。

func formattedDistanceForMeters(distance:CLLocationDistance) -> String {
        let lengthFormatter:NSLengthFormatter! = NSLengthFormatter()
        lengthFormatter.numberFormatter.maximumFractionDigits = 1

        if NSLocale.currentLocale().objectForKey(NSLocaleUsesMetricSystem).boolValue()
        {
            return lengthFormatter.stringFromValue(distance / 1000, unit:NSLengthFormatterUnitKilometer)
        }
        else
        {
            return lengthFormatter.stringFromValue(distance / 1609.34, unit:NSLengthFormatterUnitMile)
        }
    }
于 2015-06-20T11:31:08.433 に答える
3

この動作をオプトアウトする方法はないようです。正直なところ、あなたの要件は UX の観点からはあまり一般的ではありません。

meterは基本単位であり、kilometer(1000 メートル) ではないことに注意してください。通常、表示よりも表示の10 meters方が優先され0.01 kilometersます。ユーザーにとってよりフレンドリーなだけです。

基本単位が現在のロケールに依存することを考えると、特定の単位を強制する API を設計するのは実際には非常に困難です。

以下を使用して、特定のユニットを強制できます。

- (NSString *)unitStringFromValue:(double)value unit:(NSLengthFormatterUnit)unit;

ただし、ロケールとスケーリングと単位変換を自分で処理する必要があります (距離については、Objective c string formatter を参照してください) 。

于 2015-06-20T10:15:45.637 に答える