可变浮点精度格式字符串

Variable floating-point precision format string

我正在尝试以百分比形式打印浮点数,我希望小数点后的位数可以根据需要进行更改。目前我有:

fmt.Printf("%.2f%%\n", 100*(value/total))

问题是如果我的百分比恰好是 50,我将得到以下输出:

50.00%

而我想要的是:

50%

格式字符串是否有任何方式表明应使用 最大 2 位精度,但仅在需要时使用?

一种方法是使用 if 语句控制打印输出,即如果结果可以被 1 整除(结果%1 == 0),则将结果打印到无小数位。否则像上面那样打印到 .2f。不确定是否有更短的方法,但我认为这应该可行。

fmt 包没有直接的解决方案。

但您可以使用正则表达式删除末尾的点和零:

r, _ := regexp.Compile(`\.?0*$`)
fmt.Printf("%s%%\n", r.ReplaceAllString(fmt.Sprintf("%.2f", 100*(value/total)),""))

奖励:相同的正则表达式适用于任意数量的尾随零。

旁注:50.0041 的显示方式与 50 相同,这可能有点误导。

无法在 fmt 中使用例如另一面旗帜或你有什么。你必须自己写出逻辑。你可以这样做:

var final string
doubledecimal := fmt.Sprintf("%.2f", 100*value/total)
if doubledecimal[len(doubledecimal)-2:] == "00" {
    final = doubledecimal[:len(doubledecimal)-3]
} else {
    final = doubledecimal
}
fmt.Printf("%s%%\n, final)

您可以类似地使用 strings.Split 拆分小数点并从那里开始工作。

您甚至可以调整它以将 50.10% 变成 50.1%

doubledecimal := fmt.Sprintf("%.2f", 100*value/total)
// Strip trailing zeroes
for doubledecimal[len(doubledecimal)-1] == 0 {
    doubledecimal = doubledecimal[:len(doubledecimal)-1]
}
// Strip the decimal point if it's trailing.
if doubledecimal[len(doubledecimal)-1] == "." {
    doubledecimal = doubledecimal[:len(doubledecimal)-1]
}
fmt.Printf("%s%%\n", doubledecimal)