IOSアプリで通貨値をフォーマットしようとしています。デバイスの現在のロケール設定を使用して、適切な通貨フォーマットを使用しています。
シミュレーターでは、すべてが正常に実行されているようです。currencyFormatter.locale = Locale.current
を使用すると、適切なロケール設定が使用され、適切な通貨形式で数値が出力されます。
しかし、私のiPhoneでは、フランス語の地域設定でフランス語で構成されているため、別の形式が使用されることを期待しています(例:1 234,56€)。しかし、それは機能せず、英語のフォーマットスタイルを使用しているようです(例:€1 234,56)。
実際、デバイスのアプリから現在のロケールを印刷すると、期待どおりにfr_FR
が返されません。
NSLog(Locale.current.identifier)
>>> en_FR
地域は良いですが、言語はそうではありませんが、そのデバイスのiOSは明らかにフランス語です。
誰かこれについてのアイデアはありますか?
ありがとう!
@Romainの回答に基づいて、first!
をフォールバックとして使用することにより、Locale.current.identifier
の強制アンラップを回避できます。
func getPreferredLocale() -> Locale {
guard let preferredIdentifier = Locale.preferredLanguages.first else {
return Locale.current
}
return Locale(identifier: preferredIdentifier)
}
拡張子の形での@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()
@MartinRのヒントに続いて、currencyFormatter.locale = Locale(identifier: Locale.preferredLanguages.first!)
を使用しています。これは、デバイスの現在の言語と地域の設定に正確に対応しています。
このコードが完全に防弾であるかどうかは完全にはわかりません(first!
、特に)他の提案がある場合は、お気軽にどうぞ。
@Romainここでの問題は、アプリをフランス語にローカライズしておらず、英語のみにローカライズしていることです。
アプリの名前が付いた左上の青いファイルに移動し、[プロジェクト]> [情報]を選択すると、ローカリゼーションエリアに「英語-開発言語」が表示されます。 +を押してフランス語(fr)を選択します。
それでおしまい。これでLocale.currentを使用でき、デバイス(またはシミュレーター)の最初の言語がフランス語の場合、アプリはフランス語の通貨形式を表示します。