NumberFormatter で通貨をフォーマットする場合は Locale だけ設定すればいい (桁数等は考えなくていい)

NumberFormatter を利用して Decimal 等から文字列に変換する際、 NumberFormatter.locale さえ適切に設定していれば、あとは maximumFractionDigits 等は何も考えず任せておけば勝手に ISO 4217 - Wikipedia に合わせてフォーマットしてくれるという話。

最小限のコードとしては以下のようになる。

// 最小限の準備
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = .init(identifier: "ja_JP") // 適切に設定

// 利用する
let price: Decimal = 1234.5678
let result = formatter.string(for: price)!

検証コード

import Foundation

let locales = Locale.availableIdentifiers.map(Locale.init(identifier:))
let formatter = NumberFormatter()
formatter.numberStyle = .currency
let value: Decimal = 1234567890.1234567890
for locale in locales {
    formatter.locale = locale
    if let currency = locale.currency, let result = formatter.string(for: value) {
        print("Currency: \(currency), min: \(formatter.minimumFractionDigits), max: \(formatter.maximumFractionDigits), formatted: \(result)")
    }
}

結果は長すぎるので、適当に一部抜粋

Currency: usd, min: 2, max: 2, formatted: $ 1,234,567,890.12
Currency: chf, min: 2, max: 2, formatted: CHF 1 234 567 890,12
Currency: eur, min: 2, max: 2, formatted: 1.234.567.890,12 €
Currency: sar, min: 2, max: 2, formatted: ‏١٬٢٣٤٬٥٦٧٬٨٩٠٫١٢
Currency: jpy, min: 0, max: 0, formatted: JP¥1,234,567,890
Currency: jpy, min: 0, max: 0, formatted: ¥1,234,567,890
Currency: jpy, min: 0, max: 0, formatted: ¥1,234,567,890
Currency: jpy, min: 0, max: 0, formatted: JP¥ 1,234,567,890
Currency: jpy, min: 0, max: 0, formatted: ¥1,234,567,890

Swift