如何知道用户喜欢使用英里还是公里?

12
在我的应用程序中,我有一定的距离以米为单位。
如果用户喜欢千米,我想以千米为单位显示它,并且如果用户喜欢英里,则以英里为单位显示它。在第一种情况下,我想在字符串末尾添加“千米”,而在第二种情况下则添加“英里”。
实现此目标的最佳方法是什么?
谢谢。

为什么不将其作为用户偏好设置呢? - ceejayoz
阅读关于iPhone本地化的文章。==更新==由于原始链接不再有效,这里是缓存版本 - Elzo Valugi
5个回答

15

为确定用户是否使用公制,可以使用NSLocale:

- (BOOL)isMetric {
  return [[[NSLocale currentLocale] objectForKey:NSLocaleUsesMetricSystem] boolValue];
}

“false” 是指更倾向于英里还是公里? - Bartłomiej Semańczyk
@BartłomiejSemańczyk 是的。 - Chris

6

Swift中对Chris的答案的等效形式可能是这样的:

func isMetric() -> Bool {
    return ((Locale.current as NSLocale).object(forKey: NSLocale.Key.usesMetricSystem) as? Bool) ?? true
}

请注意,在某些情况下,它默认为true。根据需要进行更改。

1
您可以在首选项或其他地方向用户询问他们更喜欢英里还是公里。然后每当您显示距离时,您可以这样说。
伪C代码如下:
function distance(meters) {
    if (userPrefersKM) {
        return meters / 1000 + " kilometers";
    else if (userPrefersMiles) {
        return meters / METERS_IN_A_MILE + " miles";
}

METERS_IN_A_MILE 大约为 1600,但您应该查一下。


一英里等于1609.344米。 - Mike Pollard

1
在Swift中,Locale.current.usesMetricSystem可以获取用户的期望值。但是如果您使用Measurement,则不需要这样做,因为它会自动处理。
let distanceInMeters: Double = 2353.45

let formatter = MeasurementFormatter()
formatter.unitStyle = .medium // adjust according to your need
let distance = Measurement(value: distanceInMeters, unit: UnitLength.meters)
formatter.string(from: distance)

当前区域设置决定了向用户呈现的方式。为了查看不同区域设置下的效果,请在Xcode Playground中尝试以下操作(示例为英国和法国):

let distanceInMeters: Double = 2353.45

let formatter = MeasurementFormatter()
formatter.unitStyle = .medium // adjust according to your need
let distance = Measurement(value: distanceInMeters, unit: UnitLength.meters)

formatter.locale = Locale(identifier: "en_UK")
formatter.string(from: distance) // 1.462 mi
formatter.locale = Locale(identifier: "en_FR")
formatter.string(from: distance) // 2,353 km

不幸的是,您无法从MeasurementFormatter获取单位,除非您解析字符串(这可能会在某些使用特殊数字的语言环境(如“ar”)中出现错误)。请注意,对于en-UKformatter.string(from: UnitLength.meters)将输出metres,因为它只是“翻译”单位而不是将其转换为首选单位。 - Daniel

0

除非iPhone直接提供这些信息,否则您必须拥有一个从本地设置到默认单位的查找表。然后,您应该允许用户覆盖该默认值。


它确实直接提供了,看看我的回答 :) - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接