代码之家  ›  专栏  ›  技术社区  ›  Ilya Suzdalnitski

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

  •  9
  • Ilya Suzdalnitski  · 技术社区  · 15 年前

    在我的应用程序中,我有一段以米为单位的距离。

    如果用户喜欢公里,我想用公里显示,如果用户喜欢英里,我想用英里显示。在第一种情况下,我想在末尾加上一个字符串“公里”,在第二种情况下加上“英里”。

    实现这一目标的最佳途径是什么?

    谢谢。

    5 回复  |  直到 15 年前
        1
  •  15
  •   Chris    12 年前

    要确定用户是否使用度量,NSLocale可以告诉您:

    - (BOOL)isMetric {
      return [[[NSLocale currentLocale] objectForKey:NSLocaleUsesMetricSystem] boolValue];
    }
    
        2
  •  2
  •   RamwiseMatt    7 年前

    斯威夫特 相当于克里斯的回答是这样的:

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

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

        3
  •  1
  •   Mike Cooper    15 年前

    你可以问用户是喜欢英里还是公里,或者是别的什么。当你显示一段距离时,你会说。

    伪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,但你应该查一下。

        4
  •  1
  •   Roboris    5 年前

    在斯威夫特, 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操场上尝试(例如英国和法国):

    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
    
        5
  •  0
  •   Draemon    15 年前

    除非iPhone直接提供这些信息,否则必须有一个从locale到default unit的查找表。然后应该允许用户覆盖该默认值。