You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:47:08