可变浮点精度格式字符串

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

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

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

50.00%

虽然我想要的是:

50%

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


撒科打诨
浏览 158回答 3
3回答

富国沪深

该fmt软件包没有直接的解决方案。但是您可以使用正则表达式删除末尾的点和零:r, _ := regexp.Compile(`\.?0*$`)fmt.Printf("%s%%\n", r.ReplaceAllString(fmt.Sprintf("%.2f", 100*(value/total)),""))奖励:相同的正则表达式适用于任意数量的尾随零。旁注:您将以50.0041与 相同的方式显示50,这可能有点误导。

眼眸繁星

没有办法在内部fmt使用例如另一个标志或您拥有的东西来做到这一点。你必须自己写出逻辑。你可以这样做:var final stringdoubledecimal := 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 zeroesfor 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)

MMMHUHU

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

相关分类

Go