为了账号安全,请及时绑定邮箱和手机立即绑定

可变浮点精度格式字符串

可变浮点精度格式字符串

Go
撒科打诨 2021-12-07 10:43:50
我正在尝试将浮点数打印为百分比,并且我希望小数点后的位数根据需要而变化。目前我有:fmt.Printf("%.2f%%\n", 100*(value/total))问题是,如果我的百分比正好是 50,我将得到以下输出:50.00%虽然我想要的是:50%格式字符串是否有任何方法可以指示最多使用 2 位精度,但仅在需要时使用?
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

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


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


r, _ := regexp.Compile(`\.?0*$`)

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

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


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


查看完整回答
反对 回复 2021-12-07
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

没有办法在内部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)


查看完整回答
反对 回复 2021-12-07
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信