【Golang】以千位为单位,将数字以逗号分隔输出【千位分隔格式输出】

我想在 Go 语言(以下简称 Golang)中,将 int(1000) 格式化输出为 “1,000”,并以逗号分隔。但是发现 fmt 包里似乎没有提供专门的函数。该怎么办呢?

是否能够在 golang.org 管辖的包中进行格式化,而不需要单独实现或使用第三方包。

由于在搜索” golang逗号分隔 逗号分隔 输出格式”时,发现只有一些涉及独特实现或处理逗号分隔输入的内容,所以我想查找一些更适合我的搜索结果。

太长懒得读(今北产业)

    1. 可以使用Go的准标准模块golang.org/x/text的message包来实现。

message是一个根据本地化语言进行文本格式化的工具库,可以作为fmt的替代品。

不同国家对于数字的千位分隔符和小数点的表示方法是不同的,使用message可以进行调整。

主人,请给我一个运行的示例。
package main

import (
“golang.org/x/text/language”
“golang.org/x/text/message”
)

func main() {
value := 1000

p := message.NewPrinter(language.Japanese)

p.Printf(“%d\n”, value)

// 输出结果: 1,000
}

点击链接在Go Playground中查看运行结果

不同语言环境下的表示差异
package main

import (
“golang.org/x/text/language”
“golang.org/x/text/message”
“golang.org/x/text/number”
)

func main() {
value := 1234567.89

for _, langTag := range []language.Tag{
language.English,
language.Japanese,
language.French,
} {
p := message.NewPrinter(langTag)

p.Println(langTag)
p.Printf(” Message: %f\n”, value)
p.Printf(” Number : %v\n”, number.Decimal(value))
}

// 输出结果:
// en
// Message: 1,234,567.890000
// Number : 1,234,567.89
// ja
// Message: 1,234,567.890000
// Number : 1,234,567.89
// fr
// Message: 1 234 567,890000
// Number : 1 234 567,89
}

点击链接在Go Playground中查看运行结果

太长没看;总结一下

千位分隔符逗号的用法因国家而异。

您知道小数点和数字分隔符的表示方法在不同国家是不同的吗?

举个例子,在日本,数值1234567.89 可以写作1,234,567.89,也可以写作1.234.567,89、12,34,567.89、1 234 567,89或者1’234’567,89等等,不同于日本的国家也有不同的写法。

考虑到在日本也存在「一百二十三万四千五百六十七点八九」的表示方法,我也能理解。

还有一些国家也使用日期2001年10月11日,但它们用的是YMD格式的日期表示法,例如11/10/01(DMY)或10/11/01(MDY)。

即不同国家使用不同的数字表示方式。

將表記本地化

因此,将其转换为“适合该国的描述方式”被称为“本地化”。

您有没有试过在操作系统中更改“地区设置(locale)”后,发现数字和日期的表示方式发生了变化?就是那个东西。

说实话,我也在想为什么没有一个默认的数字格式化工具。在我调查的过程中发现,number 模块虽然是一个格式化工具,但是通过 message 的 Printer 对象来处理。当我在阅读 message 的文档时,我才意识到可能是因为语言环境的问题导致这样麻烦。

我翻译了以下抜粋自信息的内容。

本地化格式化
通过将fmt的任何打印函数替换为对Printer的等效调用,可以本地化格式化字符串。
p := message.NewPrinter(message.MatchLanguage(“en”))
p.Println(123456.78) // 输出:123,456.78

p.Printf(“%d只鸭子排成一行”, 4331) // 输出:4,331只鸭子排成一行

p := message.NewPrinter(message.MatchLanguage(“nl”))
p.Printf(“高度:%.1f米”, 1244.9) // 输出:高度:1,244.9米

p := message.NewPrinter(message.MatchLanguage(“bn”))
p.Println(123456.78) // 输出:১,২৩,৪৫৬.৭৮

Printer目前支持数字和x/text中存在的特殊类型。计划支持其他内置类型,如time.Time和slices。
格式化字符串与fmt基本相同,但有以下显着差异:

标志#始终使用fmt进行打印
动词’f’、’e’、’g’、’d’使用本地化格式化,除非指定了’#’标志。
动词’m’插入字符串参数的翻译。

更多选项请参阅fmt包。

※ 【筆者注】据我观察,这个消息好像有一个用于国际化的翻译词典功能。但由于示例文件无法运行,我也不太清楚如何使用。一旦搞清楚了,我会追加说明或写另一篇文章。

引用文献

Localized Formatting | message | text | golang.org @ pkg.go.dev
“How to fmt.Printf an integer with thousands comma” @ Stackoverflow

广告
将在 10 秒后关闭
bannerAds