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 米。

如何调整 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

似乎没有办法选择退出这种行为。老实说,从用户体验的角度来看,您的要求并不常见。

注意meter是基本单位,不是a kilometer(一千米)。通常,显示10 meters优于显示0.01 kilometers。它只是对用户更友好。

考虑到基本单元取决于当前的语言环境,设计一个强制执行特定单元的 API 实际上是非常困难的。

您可以使用以下命令强制执行特定单位:

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

但是您必须自己处理语言环境以及缩放和单位转换(请参阅Objective c string formatter for distances

于 2015-06-20T10:15:45.637 回答
2

对于不使用公制系统的人来说,这实际上是一个非常普遍的要求(是的,我知道......)。

在公制中,从公里到米等是有意义的。如果您遵循与英制相同的逻辑,您将从英里到码再到英尺。

例如,通常您不想将 Yards 用于道路距离,并且您不想显示 5,000 英尺而是 0.9 英里(实际上 Google 地图以英尺为单位显示 0.1 英里或 528 英尺,然后以英里为单位)。

let distanceAsDouble = 415.0

let lengthFormatter = LengthFormatter()

if Locale.current.usesMetricSystem {
    return distanceFormatter.string(fromMeters: distanceAsDouble)
} else {
    let metersInOneMile = Measurement<UnitLength>(value: 1.0, unit: .miles).converted(to: .meters).value
    if distanceAsDouble < metersInOneMile / 10 { // Display feets from 0 to 0.1 mi, then miles
        let distanceInFeets = Measurement<UnitLength>(value: distanceAsDouble, unit: .meters).converted(to: .feet).value
        return distanceFormatter.string(fromValue: distanceInFeets, unit: .foot)
    } else {
        return distanceFormatter.string(fromValue: distanceAsDouble / metersInOneMile, unit: .mile)
    }
}
于 2018-11-11T22:53:28.920 回答
0
-(NSString *)formattedDistance {
     
    CLLocationDistance distance = _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];
    }
}
于 2022-02-09T16:42:14.327 回答