我正在尝试将浮点数打印为百分比,我希望小数点后的位数根据需要变化。目前我有:
fmt.Printf("%.2f%%\n", 100*(value/total))
问题在于,如果我的百分比恰好是50,我会得到以下输出:
50.00%
虽然我想要的是:
50%
格式字符串是否有任何方法可以指示应使用2位精度的最大,但仅在需要时使用?
答案 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。不确定是否有更短的方法,但我认为这应该有效。