If all you need is to format your decimal number to be displayed using a specific currency what you need is Decimal.FormatStyle.Currency
. It will automatically discard the excess of precision length:
let valueString = "1234,5678"
let decimalLocale: Locale = .init(identifier: "de_DE")
let currencyLocale: Locale = .init(identifier: "en_US") // or current (used US locale just for demonstration purposes)
if let decimal = Decimal(string: valueString, locale: decimalLocale),
let currencyCode = currencyLocale.currencyCode {
let currencyStyle: Decimal.FormatStyle.Currency = .init(code: currencyCode, locale: currencyLocale)
let currencyFormatted = decimal.formatted(
currencyStyle.rounded(rule: .towardZero)
)
print(currencyFormatted) // "$1,234.56\n"
}
edit/update:
I usually don't like manipulating strings but if your source doesn't have a specific format where sometimes de decimal separator is a comma and sometimes a period you need to replace your string comma with a period before converting it to Decimal:
let valueString = "1234,5678"
let currencyLocale: Locale = .init(identifier: "en_US") // or current (used US locale just for demonstration purposes)
if let decimal = Decimal(string: valueString.replacingOccurrences(of: ",", with: ".")),
let currencyCode = currencyLocale.currencyCode {
let currencyStyle: Decimal.FormatStyle.Currency = .init(code: currencyCode, locale: currencyLocale)
let currencyFormatted = decimal.formatted(
currencyStyle.rounded(rule: .towardZero)
)
print(currencyFormatted) // "$1,234.56\n"
}