How to Fix Currency Formatting Issues with Currency.Symbol in Go?

Patricia Arquette
Release: 2024-10-24 03:43:30
Original
705 people have browsed it

How to Fix Currency Formatting Issues with Currency.Symbol in Go?

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>
Copy after login

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>
Copy after login

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!

source:php
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!