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{"en_US", "pt_BR", "de", "ja", "hi"} { 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("%24v (%v): %v%v\n", 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{"USD", "BRL", "EUR", "JPY", "INR"} { 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("%v: %v%v\n", 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("%24v %v, %4s-rounding: %3v%v\n", 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!