英文:
Convert float to string in go lang as per the required format
问题
我有4个浮点数值(startLat,startLon,endLat,endLon)在Go语言中。我想将这些值附加(替换)到下面的字符串中:
var etaString = []byte(`{"start_latitude":"` + startLat + `","start_longitude":"` + startLon + `","end_latitude":"` + endLat + `","end_longitude":"` + endLon }`)
在这样做之前,我必须将它们转换为字符串。
startLat := strconv.FormatFloat(o.Coordinate.Longitude, 'g', 1, 64)
然而,当我这样做时,我得到的这些参数的值是"4e+01 -1e+02 4e+01 -1e+02"
,但我只想要像这样的值:"64.2345"
。
我该如何实现这个目标?
英文:
I have 4 float values(startLat,startLon,endLat,endLon)in Go. I want to append(replace) these values to the below string:
var etaString = []byte(`{"start_latitude":"` + startLat + `","start_longitude":"` + startLon + `","end_latitude":"` + endLat + `","end_longitude":"` + endLon }`)
I have to typecast them to string before doing so.
startLat := strconv.FormatFloat(o.Coordinate.Longitude, 'g', 1, 64)
However, when I do so, I get the values of these parameters as "4e+01 -1e+02 4e+01 -1e+02"
But I just want something like this: "64.2345"
.
How can I achieve this?
答案1
得分: 11
> strconv 包
>
> import "strconv" > func FormatFloat
>
> func FormatFloat(f float64, fmt byte, prec, bitSize int) string
>
> FormatFloat 函数将浮点数 f 转换为字符串,根据格式 fmt 和精度 prec 进行转换。它假设原始值是从 bitSize 位的浮点数(32 位为 float32,64 位为 float64)获得的,并对结果进行四舍五入。
>
> 格式 fmt 可以是以下之一:'b'(-ddddp±ddd,二进制指数)、'e'(-d.dddde±dd,十进制指数)、'E'(-d.ddddE±dd,十进制指数)、'f'(-ddd.dddd,无指数)、'g'(对于大指数为'e',否则为'f')、'G'(对于大指数为'E',否则为'f')。
>
> 精度 prec 控制由 'e'、'E'、'f'、'g' 和 'G' 格式打印的数字(指数除外)的位数。对于 'e'、'E' 和 'f',它是小数点后的位数。对于 'g' 和 'G',它是总位数。特殊的精度 -1 使用最少的位数,以便 ParseFloat 函数能够精确返回 f。
使用精度 -1
,而不是 1
。使用格式 f
,而不是 g
,以避免对大指数使用指数形式(参见HectorJ的评论)。
startLat := strconv.FormatFloat(o.Coordinate.Longitude, 'f', -1, 64)
例如:
package main
import (
"fmt"
"strconv"
)
func main() {
f := 64.2345
s := strconv.FormatFloat(f, 'g', 1, 64)
fmt.Println(s)
s = strconv.FormatFloat(f, 'f', -1, 64)
fmt.Println(s)
}
输出:
6e+01
64.2345
英文:
> Package strconv
>
> import "strconv" > func FormatFloat
>
> func FormatFloat(f float64, fmt byte, prec, bitSize int) string
>
> FormatFloat converts the floating-point number f to a string,
> according to the format fmt and precision prec. It rounds the result
> assuming that the original was obtained from a floating-point value of
> bitSize bits (32 for float32, 64 for float64).
>
> The format fmt is one of 'b' (-ddddp±ddd, a binary exponent), 'e'
> (-d.dddde±dd, a decimal exponent), 'E' (-d.ddddE±dd, a decimal
> exponent), 'f' (-ddd.dddd, no exponent), 'g' ('e' for large exponents,
> 'f' otherwise), or 'G' ('E' for large exponents, 'f' otherwise).
>
> The precision prec controls the number of digits (excluding the
> exponent) printed by the 'e', 'E', 'f', 'g', and 'G' formats. For 'e',
> 'E', and 'f' it is the number of digits after the decimal point. For
> 'g' and 'G' it is the total number of digits. The special precision -1
> uses the smallest number of digits necessary such that ParseFloat will
> return f exactly.
Use a precision of -1
, not 1
. Use a format of f
, not g
to avoid exponent form for large exponents (see HectorJ's comment).
startLat := strconv.FormatFloat(o.Coordinate.Longitude, 'f', -1, 64)
For example,
package main
import (
"fmt"
"strconv"
)
func main() {
f := 64.2345
s := strconv.FormatFloat(f, 'g', 1, 64)
fmt.Println(s)
s = strconv.FormatFloat(f, 'f', -1, 64)
fmt.Println(s)
}
Output:
6e+01
64.2345
答案2
得分: 0
其他选项:
package main
import "fmt"
func main() {
n := 64.2345
{ // 示例 1
s := fmt.Sprint(n)
fmt.Println(s == "64.2345")
}
{ // 示例 2
s := fmt.Sprintf("%v", n)
fmt.Println(s == "64.2345")
}
{ // 示例 3
s := fmt.Sprintf("%g", n)
fmt.Println(s == "64.2345")
}
}
英文:
Some other options:
package main
import "fmt"
func main() {
n := 64.2345
{ // example 1
s := fmt.Sprint(n)
fmt.Println(s == "64.2345")
}
{ // example 2
s := fmt.Sprintf("%v", n)
fmt.Println(s == "64.2345")
}
{ // example 3
s := fmt.Sprintf("%g", n)
fmt.Println(s == "64.2345")
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论