Maison >développement back-end >Golang >Comment résoudre les problèmes de formatage des devises dans Go à l'aide de golang.org/x/text/currency

Comment résoudre les problèmes de formatage des devises dans Go à l'aide de golang.org/x/text/currency

Patricia Arquette
Patricia Arquetteoriginal
2024-10-24 02:18:29785parcourir

How to Fix Currency Formatting Issues in Go Using golang.org/x/text/currency

Formatage de devises avec golang.org/x/text/currency

Lors du formatage de valeurs en tant que devise dans Go, golang.org/x Le package /text/currency fournit une solution pratique. Cependant, si le résultat apparaît sans virgules ni séparateurs de milliers, cet article explore les causes potentielles et les solutions.

Formatage incorrect : points contre virgules

Dans le code fourni , le problème vient de l'utilisation directe de monnaie.Symbol au lieu d'utiliser le formatage plus complet fourni par message.NewPrinter. L'approche correcte consiste à utiliser message.NewPrinter pour gérer le formatage spécifique à la langue approprié :

<code class="go">func (produto *Produto) FormataPreco(valor int64) string {
    unit, _ := currency.ParseISO("BRL")
    p := message.NewPrinter(language.BrazilianPortuguese)
    return p.Sprint(unit.Amount(float64(valor) / 100))
}</code>

Ressources locales du système

Pour formater la devise à l'aide des ressources locales du système, la solution nécessite de déduire le format du code de langue. Ceci peut être réalisé en utilisant display.Tags :

<code class="go">n := display.Tags(language.English)
for _, lcode := range []string{&quot;en_US&quot;, &quot;pt_BR&quot;, &quot;de&quot;, &quot;ja&quot;, &quot;hi&quot;} {
    lang := language.MustParse(lcode)
    cur, _ := currency.FromTag(lang)
    scale, _ := currency.Cash.Rounding(cur) // fractional digits
    dec := number.Decimal(100000.00, number.Scale(scale))
    p := message.NewPrinter(lang)
    p.Printf(&quot;%24v (%v): %v%v\n&quot;, n.Name(lang), cur, currency.Symbol(cur), dec)
}</code>

Alternativement, les codes de devise ISO peuvent être analysés, mais la langue de sortie doit être spécifiée séparément :

<code class="go">for _, iso := range []string{&quot;USD&quot;, &quot;BRL&quot;, &quot;EUR&quot;, &quot;JPY&quot;, &quot;INR&quot;} {
    cur := currency.MustParseISO(iso)
    scale, _ := currency.Cash.Rounding(cur) // fractional digits
    dec := number.Decimal(100000.00, number.Scale(scale))
    p := message.NewPrinter(language.English)
    p.Printf(&quot;%v: %v%v\n&quot;, cur, currency.Symbol(cur), dec)
}</code>

Exigences d'arrondi

Certaines devises nécessitent un arrondi par incréments (par exemple, 0,05 ou 0,50). Pour cela, un traitement supplémentaire est nécessaire pour fournir la chaîne d'incrémentation correcte au formateur décimal :

<code class="go">scale, incCents := currency.Cash.Rounding(cur) // fractional digits
incFloat := math.Pow10(-scale) * float64(incCents)
incFmt := strconv.FormatFloat(incFloat, 'f', scale, 64)
dec := number.Decimal(100000.26,
    number.Scale(scale), number.IncrementString(incFmt))
p.Printf(&quot;%24v %v, %4s-rounding: %3v%v\n&quot;,
    n.Name(lang), cur, incFmt, currency.Symbol(cur), dec)</code>

En utilisant ces approches, il devient possible de formater les valeurs monétaires dans Go en utilisant golang.org/x/text/ devise tout en garantissant une localisation et un formatage corrects en fonction des ressources locales du système ou des codes de devise ISO.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn