go - 在 Go 中为 unicode.IsNumber() 函数的输入略有变化获得不同的输出
问题描述
为什么 unicode.IsNumber(rune(truncfloat)) 在某些情况下返回 false?
55.3 输出为真 58.3 输出为假
下面是我的代码:
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'
or '9'
。虽然您确实传递了一个符文,但包含的值只是代码点 55 和 58 映射到的任何值。您将通过添加:
fmt.Println(string(rune(truncfloat)))
这将打印7
for55
和:
for 58
。:
不是数字,因此您的检查失败。
你真正想要做的是转换成int
而不是rune
(因为你关心结果的整数值,而不是它的Unicode代码点)并在转换之前做你的数字检查(因为int
不能保存不是数字的值(南))。
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)
推荐阅读
- angular - 开玩笑单元测试“找不到具有未指定名称属性的控件”
- c++ - 修复 for 循环中的内存泄漏
- c++ - winsock 无法连接到本地主机
- javascript - 书只移到两个书架,而不是第三个书架。还有事件处理错误
- javascript - 如何在 Typescript 中循环对象?元素隐式具有“任何”类型,因为索引表达式不是“数字”类型
- r - 如何防止R在找不到要打开的文件时停止?
- python - Tableau Server Api 使用多个值筛选器填充 csv
- php - 在刀片中,我想打印除来自模型的 $id 项目之外的所有项目
- python - 在 pandas 中的 groupby 之后转置一些列
- reactjs - 如何访问子元素的引用