ホームページ >バックエンド開発 >Golang >golang.org/x/text/currency を使用して Go で通貨の書式設定の問題を修正する方法

golang.org/x/text/currency を使用して Go で通貨の書式設定の問題を修正する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-24 02:18:29787ブラウズ

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

golang.org/x/text/currency による通貨の書式設定

Go で値を通貨として書式設定する場合、golang.org/x /text/currency パッケージは便利なソリューションを提供します。ただし、出力にカンマまたは桁区切り記号が含まれていない場合、この記事では考えられる原因と解決策を検討します。

間違った書式設定: ポイントとカンマ

提供されたコード内この問題は、message.NewPrinter が提供するより包括的な書式設定を使用せずに、currency.Symbol を直接使用することで発生します。正しいアプローチは、message.NewPrinter を使用して適切な言語固有の書式設定を処理することです。

<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>

システム ロケール リソース

システム ロケール リソースを使用して通貨を書式設定するには、この解決策では、言語コードから形式を推測する必要があります。これは、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>

または、ISO 通貨コードを解析できますが、出力言語は個別に指定する必要があります:

<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>

丸め要件

特定の通貨では、増分単位で四捨五入する必要があります (例: 0.05 または 0.50)。これに対応するには、正しい IncrementString を Decimal フォーマッタに提供するための追加処理が必要です。

<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>

これらのアプローチを利用することで、golang.org/x/text/ を使用して Go で通貨値をフォーマットすることが可能になります。システム ロケール リソースまたは ISO 通貨コードに基づいて正しいローカリゼーションと書式設定を確保しながら通貨を設定します。

以上がgolang.org/x/text/currency を使用して Go で通貨の書式設定の問題を修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。