将float格式化为n个小数位并且不包含尾随零

时间:2015-07-08 10:03:37

标签: go floating-point-conversion

我希望显示一个包含整个整数部分的浮点数和小数部分最多两位小数,而不显示尾随零。

http://play.golang.org/p/mAdQl6erWX

// Desired output: 
// "1.9"
// "10.9"
// "100.9"

fmt.Println("2g:")
fmt.Println(fmt.Sprintf("%.2g", 1.900)) // outputs "1.9"
fmt.Println(fmt.Sprintf("%.2g", 10.900)) // outputs "11"
fmt.Println(fmt.Sprintf("%.2g", 100.900)) // outputs "1e+02"

fmt.Println("\n2f:")
fmt.Println(fmt.Sprintf("%.2f", 1.900)) // outputs "1.90"
fmt.Println(fmt.Sprintf("%.2f", 10.900)) // outputs "10.90"
fmt.Println(fmt.Sprintf("%.2f", 100.900)) // outputs "100.90"

使用2g进行格式化时会出现问题,即当整数增加数量级时,它会开始舍入。此外,它有时会显示带有e的数字。

使用2f格式化会出现显示尾随零的问题。我可以编写一个删除尾随零的后处理函数,但我宁愿用Sprintf执行此操作。

这可以使用Sprintf以通用方式完成吗? 如果没有,那么这样做的好方法是什么?

4 个答案:

答案 0 :(得分:21)

strconv.FormatFloat(10.900, 'f', -1, 64)

这将导致10.9

作为第三个参数的-1告诉函数打印准确表示浮动所需的最少数字。

见这里:https://golang.org/pkg/strconv/#FormatFloat

答案 1 :(得分:4)

Sprintf不确定,但要使其有效。只需向右裁剪,先0然后.

fmt.Println(strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", 100.900), "0"), ".")) // 100.9
fmt.Println(strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", 100.0), "0"), ".")) // 100

答案 2 :(得分:0)

我使用以下功能实现了相同功能:

//return 45.00 with "45" or 45.50 with "45.5"
func betterFormat(num float32) string {
    s := fmt.Sprintf("%.4f", num)
    return strings.TrimRight(strings.TrimRight(s, "0"), ".")
}

答案 3 :(得分:0)

使用以下功能来格式化和控制数字位数。

func FormatFloat(num float64, prc int) string {
    var (
        zero, dot = "0", "."

        str = fmt.Sprintf("%."+strconv.Itoa(prc)+"f", num)
    )

    return strings.TrimRight(strings.TrimRight(str, zero), dot)
}

这里是一个例子:

// Convert 18.24100100 to 18.24
fmt.Print(FormatFloat(18.24100100, 2))