gpt4 book ai didi

go - 使用golang.org/x/text/currency中的currency.Symbol在Golang中使用货币格式

转载 作者:行者123 更新时间:2023-12-03 10:09:38 28 4
gpt4 key购买 nike

嗨,我正在使用一种功能来格式化货币值。我正在使用golang.org/x/text/currency进行工作,但是我得到的输出中带有点的位置是逗号,没有数千个分隔符。

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

预期的结果应该是R $ 123.456,78,但我得到R $ 123456.78

- - 编辑 - -

我使用硬编码值创建了一个版本,但是我想要一个使用系统区域设置资源的解决方案。
func (produto *Produto) FormataPreco(valor int64) string {
p := message.NewPrinter(language.BrazilianPortuguese)
return p.Sprintf("R$ %.2f", float64(valor/100))
}

最佳答案

在此示例中,我从语言代码推断出货币格式。
https://goplay.space/#fqs9t8MG062

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

// American English (USD): $100,000.00
// Brazilian Portuguese (BRL): R$100.000,00
// German (EUR): €100.000,00
// Japanese (JPY): ¥100,000
// Hindi (INR): ₹1,00,000.00
您也可以解析ISO货币代码,但随后还必须指定格式化数字的语言。输出语言不会影响小数位数,但是会影响使用逗号和句点的位置:
https://goplay.space/#DlxSmjZbHH6
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)
}

// USD: $100,000.00
// BRL: R$100,000.00
// EUR: €100,000.00
// JPY: ¥100,000
// INR: ₹100,000.00
某些货币会以0.05或0.50为单位四舍五入。在这种情况下, currency.Cash.Rounding(cur)的第二个返回值将返回5或50而不是1。要为Decimal格式化程序提供期望的IncrementString,我们必须做更多的处理:
package main

import (
"math"
"strconv"

"golang.org/x/text/currency"
"golang.org/x/text/language"
"golang.org/x/text/language/display"
"golang.org/x/text/message"
"golang.org/x/text/number"
)

func main() {
n := display.Tags(language.English)
for _, lcode := range []string{"en_US", "en_CA", "da", "ja"} {
lang := language.MustParse(lcode)
cur, _ := currency.FromTag(lang)
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 := message.NewPrinter(lang)
p.Printf("%24v %v, %4s-rounding: %3v%v\n",
n.Name(lang), cur, incFmt, currency.Symbol(cur), dec)
}
}

// American English USD, 0.01-rounding: $100,000.26
// Canadian English CAD, 0.05-rounding: CA$100,000.25
// Danish DKK, 0.50-rounding: DKK100.000,50
// Japanese JPY, 1-rounding: ¥100,000

关于go - 使用golang.org/x/text/currency中的currency.Symbol在Golang中使用货币格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47801050/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com