为什么unicode.IsNumber(rune(truncfloat))在某些情况下返回false ?
对于55.3输出为真对于58.3,输出为false
下面是我的代码:package main
import (
"fmt"
"unicode"
)
func main() {
var truncint int
var truncfloat float64
fmt.Printf("Enter a floating point number: ")
num, err := fmt.Scan(&truncfloat)
if unicode.IsNumber(rune(truncfloat)) {
truncint = int(truncfloat)
fmt.Printf("Trucated number is: %d", truncint)
} else {
fmt.Printf("Recieved %d numbers, Error: %s", num, err)
}
}
以下是带有执行输出的测试用例:
PS C:learngo> .trunc.exe
Enter a floating point number: 58.3
Recieved 1 numbers, Error: %!s(<nil>)
PS C:learngo> .trunc.exe
Enter a floating point number: 55.3
Trucated number is: 55
函数unicode.IsNumber()
需要符文,例如'0'
或'9'
。虽然您确实传递了符文,但包含的值只是代码点55和58所映射的值。您可以通过添加
fmt.Println(string(rune(truncfloat)))
这将为55
打印7
,为58
打印:
。:
不是数字,所以检查失败。
你真正想做的是转换为int
而不是rune
(因为你关心的是结果的整数值,而不是它的Unicode码点),并在转换之前做你的数字检查(因为int
不能保存不是数字(NaN)的值)。
if math.IsNaN(truncfloat) {
fmt.Println("Entered float is not a number")
return
}
if truncfloat > math.MaxInt || truncfloat < math.MinInt {
fmt.Println("Entered float is outside of int range")
return
}
truncint = int(truncfloat)
fmt.Printf("Truncated number is: %d", truncint)