代码之家  ›  专栏  ›  技术社区  ›  Michael

从测量中获取局部单位的值

  •  0
  • Michael  · 技术社区  · 6 年前

    我需要国际化 价值 一种测量方法。

    let speed = Measurement(value: 15, unit: UnitSpeed.kilometersPerHour)
    let formatter = MeasurementFormatter()
    formatter.string(from: speed) // is "9.32 mph"
    speed.converted(to: .milesPerHour).value // this is what I want, but I have to hardcode the unit I am converting to
    

    我能得到价值吗( 9.32 )不需要手动分裂和铸造琴弦?对于您可以使用的温度 formatter.unitOptions = .temperatureWithoutUnit 但这将停止转换,我仍然会得到一个字符串。

    有什么像 speed.converted(to: default).value 获取局部测量值?

    3 回复  |  直到 6 年前
        1
  •  1
  •   matt    6 年前

    你真正想知道的是:用户使用的是什么测量系统?

    答案与测量或测量格式无关。答案来自当地。这就是计量器的工作原理 作品 . 它会参考现场。你也可以!只要说 if Locale.current.usesMetricSystem 并根据结果进行。

        2
  •  3
  •   CRD    6 年前

    我想你要的是现场的测量系统。mac目前了解三种系统:metric、us和uk。英国使用公制表示长度和重量,但仍然使用英里/英里/小时表示道路距离和速度,因此这里的第三个选项是 usesMetricSystem 属性只支持两个选项和返回 true 为了英国。

    要在swift中获得测量系统,需要使用 NSLocale ,此扩展将添加到 Locale :

    extension Locale
    {
       var measurementSystem : String?
       {
          return (self as NSLocale).object(forKey: NSLocale.Key.measurementSystem) as? String
       }
    }
    

    为了增加“乐趣”,苹果并没有实际指定这个属性的值,他们给出了一些例子,但没有给出完整的定义。您可以获取已知的三个值来查询已知使用它们的三个区域设置上的属性,例如,您可以将以下内容添加到扩展:

       static let metricMeasurementSystem = Locale(identifier: "fr_FR").measurementSystem!
       static let usMeasurementSystem = Locale(identifier: "en_US").measurementSystem!
       static let ukMeasurementSystem = Locale(identifier: "en_UK").measurementSystem!
    

    当然,如果斯威夫特真的支持他们,它可能会定义 enum 对于可能性,你也可以这么做。

    高温高压

    顺便说一句:对于那些认为英国尴尬的人来说,“美国”制度只在三个国家使用:美国、缅甸和利比里亚。

        3
  •  0
  •   Skyborg    6 年前

    感谢@crd,我这样做了:

    添加扩展名:

    extension Locale{
       var measurementSystem : String?
       {
           return (self as NSLocale).object(forKey: NSLocale.Key.measurementSystem) as? String
       }
    

    }

    class func perfSpeedFormatOnlyDigits(_ kmh: Double) -> String {
    
       let numberFormatter = NumberFormatter()
       numberFormatter.maximumFractionDigits = 0
    
       let formatter = MeasurementFormatter()
       let kilometersPerHour = Measurement(value: kmh, unit: UnitSpeed.kilometersPerHour)
       formatter.locale = (Locale.current.measurementSystem != "Metric") ? Locale(identifier: "en_US") : Locale.current
       formatter.unitStyle = .long //you have to use long to replace the correct String
       formatter.unitOptions = .naturalScale
       formatter.numberFormatter = numberFormatter
       if Locale.current.measurementSystem != "Metric" {
          return formatter.string(from: kilometersPerHour).replacingOccurrences(of: formatter.string(from: UnitSpeed.milesPerHour), with: "")
       }else {
          return formatter.string(from: kilometersPerHour).replacingOccurrences(of: formatter.string(from: UnitSpeed.kilometersPerHour), with: "")
       } 
    }