在我的应用程序中,我有一定距离米。
如果用户喜欢数公里,我希望以千米为单位显示它,如果用户喜欢里程,则以英里显示。在第一种情况下,我想在末尾添加一个字符串“km”,在第二种情况下添加“miles”。
实现这一目标的最佳方法是什么?
谢谢。
要确定用户是否使用度量标准,NSLocale可以告诉您:
- (BOOL)isMetric {
return [[[NSLocale currentLocale] objectForKey:NSLocaleUsesMetricSystem] boolValue];
}
斯威夫特相当于克里斯的回答是这样的:
func isMetric() -> Bool {
return ((Locale.current as NSLocale).object(forKey: NSLocale.Key.usesMetricSystem) as? Bool) ?? true
}
请注意,在某些情况下,它默认为true
。根据需要改变。
您可以询问用户他们是偏好英里还是公里,是偏好还是某种东西。然后,只要你显示一个距离,你会说。
在伪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,但你应该看看。
在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
除非iPhone直接提供此信息,否则您必须具有从区域设置到默认单元的查找表。然后,您应该允许用户覆盖该默认值。