Locale.current在设备上报告错误的语言

我正在尝试在iOS应用中格式化货币值,并且我正在使用设备上的当前区域设置来使用适当的货币格式。

在模拟器中,一切似乎都运行良好:当使用currencyFormatter.locale = Locale.current ,它采用正确的区域设置并使用正确的货币格式打印数字。

然而,在我的iPhone上,使用法语区域设置法语配置,我希望使用另一种格式(例如: 1 234,56€ )。 但它不起作用,似乎使用英语格式(例如: €1 234,56 )。

事实上,如果我从设备上的应用程序打印当前的Locale,它不会像我期望的那样返回fr_FR

 NSLog(Locale.current.identifier) >>> en_FR 

该地区很好,但语言不是,虽然该设备上的iOS显然是法语。

有人对此有所了解吗?

谢谢!

根据@Romain的回答强行解开first! 可以通过使用Locale.current.identifier作为回退来避免。

 func getPrefferedLocale() -> Locale { guard let prefferredIdentifier = Locale.preferredLanguages.first else { return Locale.current } return Locale(identifier: prefferredIdentifier) } 

按照@ MartinR的提示,我现在使用currencyFormatter.locale = Locale(identifier: Locale.preferredLanguages.first!) ,它完全对应于设备的当前语言和区域设置。

我不完全确定这个代码是防弹的(因为first! ,最值得注意的是)所以如果你有其他的建议,请随意。

@ florieger以扩展名的forms回答:

 import Foundation extension Locale { static func prefferedLocale() -> Locale { guard let prefferredIdentifier = Locale.preferredLanguages.first else { return Locale.current } return Locale(identifier: prefferredIdentifier) } } 

然后像这样使用它:

 dateFormatter.locale = Locale.prefferedLocale() datePicker.locale = Locale.prefferedLocale()