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

时间:2018-01-05 10:13:36

标签: string go localization string-formatting

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

fmt.Sprintf("%.2f%s", percentageValue, "%%")

输出类似于52.12%。但我想用英语以外的其他语言打印,小数点是逗号,。如何使用fmt.Sprintf在Go中执行此操作。我希望输出像 52,12%

4 个答案:

答案 0 :(得分:12)

HADOOP_USER_NAME=hdfs hdfs dfs -rm -R -f -skipTrash /包不支持替换浮点数中的分隔符的功能。您应该使用专为此目的而设计的golang.org/x/text/message包。

答案 1 :(得分:3)

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

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

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

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

52,12%

或使用映射功能:

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

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

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

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

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)

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

如果您需要&#34;完整&#34;本地化支持,然后检查并使用golang.org/x/text/message,其中&#34;为本地化字符串实现格式化I / O,其功能类似于fmt的打印功能。它是fmt的替代品。&#34;

答案 2 :(得分:2)

我找到了一个可以做到这一点的图书馆,它被称为人性化。 有了这个,您可以执行类似fmt.Println(humanize.FormatFloat("00,00", 52.20))

的操作

请参阅以下链接中的说明: https://github.com/dustin/go-humanize

答案 3 :(得分:1)

我已经解决了这个问题:

func getFormattedValue(percentageValue float64) string{
  value := fmt.Sprintf("%.2f%s", percentageValue, "%")
  return strings.Replace(value, ".", ",", -1)
}

我正在使用浮动值并转换为字符串,然后将.替换为,