将浮点数格式化为 n 个小数位并且没有尾随零

Format a float to n decimal places and no trailing zeros

我想显示一个浮点数,其中包含整个整数部分和小数部分最多两位小数,不带尾随零。

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 格式化会出现尾随零的问题。我可以编写一个 post 处理函数来删除尾随零,但我宁愿使用 Sprintf.

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

不确定 Sprintf 但要让它发挥作用。刚刚 trim 对,先 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

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

这将导致 10.9

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

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

我使用下面的函数来实现相同的目的:

//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"), ".")
}

使用下面的函数来格式化和控制位数。

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)
}

这是一个例子:

// Converts 18.24100100 to 18.24
fmt.Println(FormatFloat(18.24100100, 2))