如何在fmt.Sprintf中打印小数点为逗号(,)的浮点数

Jai*_*rak 9 string localization string-formatting go

我正在打印浮点值(例如:52.12:),如下所示:

fmt.Sprintf("%.2f%s", percentageValue, "%%")
Run Code Online (Sandbox Code Playgroud)

输出就像52.12%.但我想用英文以外的其他语言打印,小数点是逗号,.如何在Go中使用fmt.Sprintf.我想要这样的输出52,12%.

Fli*_*mzy 12

fmt程序包不支持在浮点数中替换分隔符的功能.您应该使用专为此目的而设计的golang.org/x/text/message包.


icz*_*cza 5

标准库(和fmt包)不支持本地化文本和数字格式。
如果您只需要本地化小数点,您可以使用简单的方法将点 ( .) 替换为逗号字符 ( ,),如下所示:

percentageValue := 52.12
s := fmt.Sprintf("%.2f%%", percentageValue)
s = strings.Replace(s, ".", ",", -1)
fmt.Println(s)
Run Code Online (Sandbox Code Playgroud)

(另请注意,您可以%通过%%在格式字符串中使用 2 个百分号来输出百分号。)

哪些输出(在Go Playground上试试):

52,12%
Run Code Online (Sandbox Code Playgroud)

或者使用映射函数:

func dot2comma(r rune) rune {
    if r == '.' {
        return ','
    }
    return r
}

func main() {
    percentageValue := 52.12
    s := fmt.Sprintf("%.2f%%", percentageValue)
    s = strings.Map(dot2comma, s)
    fmt.Println(s)
}
Run Code Online (Sandbox Code Playgroud)

输出是一样的。在Go Playground上试试这个。

另一种解决方案可能是分别格式化整数和小数部分,并用逗号将它们粘在一起,

percentageValue := 52.12
i, f := math.Modf(percentageValue)
s := fmt.Sprint(i) + "," + fmt.Sprintf("%.2f%%", f)[2:]
fmt.Println(s)
Run Code Online (Sandbox Code Playgroud)

Go Playground上试试这个。

请注意,如果百分比值为负,则后一种解决方案需要“调整”:

percentageValue := -52.12
i, f := math.Modf(percentageValue)
if f < 0 {
    f = -f
}
s := fmt.Sprint(i) + "," + fmt.Sprintf("%.2f%%", f)[2:]
fmt.Println(s)
Run Code Online (Sandbox Code Playgroud)

这个修改后的版本现在可以-52,12%正确打印。在Go Playground上试一试。

如果您需要“完整的”本地化支持,那么请检查并使用golang.org/x/text/message,它使用类似于 fmt 的打印功能的功能为本地化字符串实现格式化的 I/O。它是 fmt 的直接替代品。”