变量浮点精度格式字符串

时间:2016-01-16 16:59:26

标签: go format format-string

我正在尝试将浮点数打印为百分比,我希望小数点后的位数根据需要变化。目前我有:

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

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

50.00%

虽然我想要的是:

50%

格式字符串是否有任何方法可以指示应使用2位精度的最大,但仅在需要时使用?

3 个答案:

答案 0 :(得分:2)

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

但是你可以用正则表达式删除最后的点和零:

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

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

附注:您将以50.0041的方式显示50,这可能有点误导。

答案 1 :(得分:1)

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)

答案 2 :(得分:0)

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