可变浮点精度格式字符串
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)
我正在尝试以百分比形式打印浮点数,我希望小数点后的位数可以根据需要进行更改。目前我有:
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)