Currency Formatting in Go with golang.org/x/text/currency's Currency.Symbol
The golang.org/x/text/currency package provides extensive support for formatting currency values. This article demonstrates how to leverage Currency.Symbol to achieve proper formatting, addressing common issues like incorrect thousands separators and point placement.
Issue:
Users encounter the issue that their output lacks thousands separators and incorrectly displays points instead of commas for currency formatting.
Underlying Problem:
The issue stems from the default behavior of currency.Symbol, which returns the currency's symbol without any locale-specific formatting. As a result, decimal points and thousands separators are not correctly applied.
Solution 1: Inferring Currency Format from Language Code
One solution involves inferring the currency format from the language code used in the language package. By setting the Printer's language to the desired locale, the output will be formatted according to the locale's conventions. For instance, for Brazilian Portuguese, the output would be formatted as "R$ 123.456,78."
<code class="go">package main import ( "golang.org/x/text/currency" "golang.org/x/text/language" "golang.org/x/text/message" ) func main() { unit, _ := currency.ParseISO("BRL") const valor = 12345678 p := message.NewPrinter(language.BrazilianPortuguese) formatted := p.Sprint(currency.Symbol(unit.Amount(float64(valor) / 100))) println(formatted) // Output: R$ 123.456,78 }</code>
Solution 2: Parsing ISO Currency Codes and Specifying Language
Another approach is to parse ISO currency codes and explicitly set the language for formatting. This method provides more flexibility in specifying the desired output format.
<code class="go">package main import ( "golang.org/x/text/currency" "golang.org/x/text/language" "golang.org/x/text/message" "golang.org/x/text/number" ) func main() { unit, _ := currency.ParseISO("BRL") const valor = 12345678 lang := language.Portuguese p := message.NewPrinter(lang) formatted := p.Sprintf( number.Format("%q%v", currency.Symbol(unit.Amount(float64(valor) / 100), lang), number.Decimal(valor, number.Scale(2)), )) println(formatted) // Output: R$ 123.456,78 }</code>
Considerations for Incrementally Rounded Currencies
For currencies that are rounded incrementally (e.g., by 0.05 or 0.50), additional processing is necessary to provide the Decimal formatter with a suitable IncrementString. This ensures that the rounded values are formatted appropriately.
Conclusion
By utilizing Currency.Symbol in conjunction with language-aware printing, developers can achieve precise currency formatting in Go, addressing the common issues of incorrect thousands separators and misplaced decimal points.
The above is the detailed content of How to Fix Currency Formatting Issues with Currency.Symbol in Go?. For more information, please follow other related articles on the PHP Chinese website!