如何在Go中格式化货币字符串?基于语言/地区自定义及currency包使用
使用golang.org/x/currency实现多地区货币格式化
你不需要手动构造state和rune,golang.org/x/currency包需要配合golang.org/x/text/language和golang.org/x/text/message包一起使用,这两个包负责处理语言地区的格式化规则。
以下是完整的实现代码:
import ( "golang.org/x/currency" "golang.org/x/text/language" "golang.org/x/text/message" ) func Format(val float64, currencyCode, langCode string) (string, error) { // 解析货币ISO编码 unit, err := currency.ParseISO(currencyCode) if err != nil { return "", err } amount := unit.Amount(val) // 解析语言标签 tag, err := language.Parse(langCode) if err != nil { return "", err } // 创建对应语言的打印机,用于格式化 p := message.NewPrinter(tag) // 使用printf格式化货币,%v会自动应用对应地区的货币格式规则 formatted := p.Sprintf("%v", amount) return formatted, nil }
关键说明:
language.Parse(langCode):将ISO语言编码(如en-GB、de-DE、ja-JP)解析为语言标签,匹配对应地区的格式化规则。message.NewPrinter(tag):创建针对该语言地区的打印机,自动加载对应的货币格式规则(包括千位分隔符、小数点位置、货币符号位置等)。- 直接用
Sprintf("%v", amount)即可完成格式化,amount类型会被message包识别并应用正确的货币格式。
测试示例:
// 英式英语格式化英镑 fmt.Println(Format(1000.99, "GBP", "en-GB")) // 输出: £1,000.99 // 德语格式化欧元 fmt.Println(Format(1000.99, "EUR", "de-DE")) // 输出: 1.000,99 € // 日语格式化日元 fmt.Println(Format(1000.99, "JPY", "ja-JP")) // 输出: ¥1,001(日元无小数位,自动四舍五入)
如果需要自定义格式(比如强制显示小数位),可以使用currency.Format选项:
formatted := p.Sprintf("%v", amount.Format(currency.Precision(2)))
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

