从测量中获取本地化单位的价值

时间:2018-06-18 16:59:42

标签: swift

我需要获得测量的国际化

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的内容来获取本地化测量的值?

4 个答案:

答案 0 :(得分:3)

我认为您所关注的是区域设置的测量系统。 Mac目前了解三个系统:公制,美国和英国。英国使用长度和重量的公制,但仍然使用英里/英里/小时的道路距离和速度,因此这里的第三个选项 - usesMetricSystem属性仅支持两个选项并返回英国的true

要在Swift中获取测量系统需要使用NSLocale,此扩展程序会将其添加到Locale

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

对于添加的“有趣”Apple实际上没有指定此属性的值,它们提供示例但不提供完整定义。您可以在已知使用它们的三个区域设置上获取已知的三个值来查询属性,例如:您可以将以下内容添加到扩展程序中:

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

当然,如果Swift确实支持它们,它可能会为可能性定义enum,你也可以这样做。

HTH

顺便说一句:对于那些认为英国尴尬的人来说,“美国”系统仅用于三个国家:美国,缅甸和利比里亚。

答案 1 :(得分:1)

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

答案与Measurement或MeasurementFormatter无关。答案来自Locale。那就是MeasurementFormatter 的工作原理。它咨询了Locale。你也可以!只需说出if Locale.current.usesMetricSystem并按照结果继续进行。

答案 2 :(得分:0)

感谢@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: "")
   } 
}

答案 3 :(得分:0)

这里是带有枚举的@CRDs扩展名。

<!-- Shared project import -->
<Import Project="..\Shared\Shared.projitems" Label="Shared" /> 
<!-- Version number generator -->
<Import Project="$([MSBuild]::GetPathOfFileAbove('Version.Build.props', '$(MSBuildThisFileDirectory)../Shared/'))" />