我正在尝试在iOS应用中格式化货币值,并且我正在使用设备上的当前区域设置来使用适当的货币格式。
在模拟器中,一切似乎都运行良好:使用currencyFormatter.locale = Locale.current
时,它采用正确的区域设置并使用正确的货币格式打印数字。
然而,在我的iPhone上,使用法语区域设置法语配置,我希望可以使用其他格式(例如: 1 234,56€)。但它不起作用,似乎使用英语格式(例如:€1 234,56 )。
事实上,如果我在设备上的应用中打印当前的Locale,它就不会像我期望的那样返回fr_FR
:
NSLog(Locale.current.identifier)
>>> en_FR
该地区很好,但语言不是,但该设备上的iOS显然是法语。
有人对此有所了解吗?
谢谢!
答案 0 :(得分:5)
根据@ Romain的回答,使用first!
作为后备可以避免强制展开Locale.current.identifier
。
func getPreferredLocale() -> Locale {
guard let preferredIdentifier = Locale.preferredLanguages.first else {
return Locale.current
}
return Locale(identifier: preferredIdentifier)
}
答案 1 :(得分:3)
@florieger以扩展名形式的答案:
import Foundation
extension Locale {
static func preferredLocale() -> Locale {
guard let preferredIdentifier = Locale.preferredLanguages.first else {
return Locale.current
}
return Locale(identifier: preferredIdentifier)
}
}
然后像这样使用它:
dateFormatter.locale = Locale.preferredLocale()
datePicker.locale = Locale.preferredLocale()
答案 2 :(得分:1)
按照@ MartinR的提示,我现在正在使用currencyFormatter.locale = Locale(identifier: Locale.preferredLanguages.first!)
,这与设备的当前语言&区域设置。
我不完全确定此代码是防弹的(因为first!
,最值得注意的是)所以如果您有其他建议,请随意。
答案 3 :(得分:0)
@罗曼 这里的问题是您尚未将应用本地化为法语,而仅将英语本地化。
转到带有应用程序名称的左上蓝色文件,选择“项目”>“信息”,然后在“本地化”区域中将看到“英语-开发语言”。 按+并选择法语(fr)。
就是这样。 现在,您可以使用Locale.current,并且如果设备(或模拟器)的第一语言是法语,则您的应用程序将显示法语货币格式。
答案 4 :(得分:0)
我花了一个小时调试这个。我在德国,我的 iPhone 语言设置是英语,我的地区是德国。
我正在调试一个应用程序,该应用程序从 iPhone 获取语言环境并将其作为标头在 API 调用中传递给服务器。我想知道为什么我总是以德语获取所有数据字符串。查看应用程序,一切都正确完成:
if let deviceLanguageCode = Locale.current.languageCode,
deviceRegionCode = Locale.current.regionCode {
// do stuff here
}
deviceLanguageCode
上方的变量始终返回 de
。
但应该是“en”!
我尝试了一切。我使用了 Locale.autoupdatingCurrent.languageCode
或 Locale.preferredLanguages.first
等,没有任何效果。我检查了我的项目设置,我的 Localizable.strings
文件。都好。如果我创建一个新的 Xcode 项目并打印这些变量,我将获得正确的语言环境和区域:en_DE
。
这太令人气愤了!
只有当我用尽所有可能性时,我才阅读了 Paul Hudson(还有谁?)的 post,最后,他给出了测试本地化的提示:
提示:您可以通过转到“产品”菜单,按住 Alt 键,然后选择“运行...”来切换语言,但您可以在那里更改为其他人以进行测试。
还有……“惊魂未定!” 有人在我之前已经在那里并将应用程序语言和地区设置为德国!!!难怪我过得很辛苦!
故事结束:确保将这些设置为系统,否则将不起作用;)