【发布时间】:2010-01-28 09:00:08
【问题描述】:
在我的应用程序本地化期间,我浏览了很多文档,我确定我在某处读到有一种方法可以获得一组与语言环境相关联的单元。
我相信它说的是“基于文化的单位……”之类的东西。
我想在某些国家/地区以华氏和英里显示温度和距离,在其他国家/地区以摄氏度和公里显示温度和距离。
有没有办法在 iPhone SDK 中访问这些单元的列表。
谢谢。
【问题讨论】:
标签: iphone localization iphone-sdk-3.1
在我的应用程序本地化期间,我浏览了很多文档,我确定我在某处读到有一种方法可以获得一组与语言环境相关联的单元。
我相信它说的是“基于文化的单位……”之类的东西。
我想在某些国家/地区以华氏和英里显示温度和距离,在其他国家/地区以摄氏度和公里显示温度和距离。
有没有办法在 iPhone SDK 中访问这些单元的列表。
谢谢。
【问题讨论】:
标签: iphone localization iphone-sdk-3.1
您可以使用NSLocale查看货币单位,但是对于英制与公制,您需要自己制作一个列表。
哎呀。您可以检查英制与公制。有NSLocaleMeasurementSystem 和NSLocaleUsesMetricSystem 键。
【讨论】:
值得一提的是,Apple 提供了一个不错的库(MKDistanceFormatter,在 iOS 7 中引入)自动将 CLLocationDistance 呈现为给定用户的区域设置和语言的适当字符串。
它会进行一些模糊舍入(例如 300 英尺->350 英尺->400 英尺),但可以很好地在单位之间进行转换(例如,英尺 -> 英里,在适当的时候这样做)。除非您需要非常精确的值,否则此类非常适合在两行代码中返回粗略估计的距离。
MKDistanceFormatter *distanceFormatter = [[MKDistanceFormatter alloc] init];
[distanceFormatter setUnitStyle:MKDistanceFormatterUnitStyleAbbreviated]; // Optional
NSString *formattedDistance = [distanceFormatter stringFromDistance:100];
NSLog(@"%@",formattedDistance); // Prints "350 ft"
【讨论】:
我只是想指出,随着 iOS8 的发布,至少您提到的某些单元将有新的NSFormatters。
将有NSLengthFormatter、NSMassFormatter 和NSEnergyFormatter,它们非常易于使用——请参阅iOS8 NSFormatter tutorial。这是一个使用 NSLengthFormatter 和 swift 的示例:
let lengthFormatter = NSLengthFormatter()
println(@"Kilometer: %@", lengthFormatter.stringFromValue(1000, unit: .Kilometer)) //Kilometer: 1,000 km
【讨论】:
斯威夫特:
1.)
import MapKit
2.) 由于创建格式化程序很昂贵,您最好将格式化程序设置为惰性属性。通过这样做,您可以仅在必要时初始化格式化程序并重用格式化程序而不是创建新的格式化程序。
lazy var distanceFormatter: MKDistanceFormatter = {
var tempDistanceFormatter = MKDistanceFormatter()
tempDistanceFormatter.unitStyle = .Abbreviated // .abbreviated in Swift 3
return tempDistanceFormatter
}()
3.)
let distanceString = self.distanceFormatter.stringFromDistance(yourDistance)
【讨论】:
我已将此方法提取到字符串扩展。看起来很优雅
Swift 4.1 版本
import MapKit
extension String {
init(distance: Double ) {
let mkDistanceFormatter = MKDistanceFormatter()
mkDistanceFormatter.unitStyle = .abbreviated
self = mkDistanceFormatter.string(fromDistance: distance)
}
}
用法
let distance = Double(34234.0)
let stringDistance String(distance:distance)
【讨论】: