Go语言unicode.IsNumber()函数输入轻微变动返回不同结果问题
异常现象原因
- 你对
unicode.IsNumber函数的功能存在根本误解:该函数的作用是判断传入的Unicode码点是否对应数字类字符,而非判断一个数值本身是不是数字类型。你直接将浮点数强制转换为rune类型,本质是把浮点数的整数部分当作Unicode码点传入校验,自然会出现不符合预期的结果。 - 输入55.3时,
rune(55.3)取整得到码点55,对应的ASCII字符是7,属于数字字符,因此函数返回true;输入58.3时,rune(58.3)取整得到码点58,对应的ASCII字符是:,不属于数字字符,因此函数返回false,这就是你观测到的差异的根本原因。 - 额外逻辑错误:你没有正确处理
fmt.Scan的返回值,该函数返回的err为nil时才代表输入合法,你当前的逻辑完全跳过了输入合法性校验,反而用错误的Unicode校验替代了输入校验。
修复方案
你的核心需求是读取浮点数后截断为整数输出,不需要调用unicode.IsNumber,直接校验输入是否成功即可,修复后代码如下:
package main import ( "fmt" ) func main() { var truncint int var truncfloat float64 fmt.Printf("Enter a floating point number: ") _, err := fmt.Scan(&truncfloat) if err == nil { truncint = int(truncfloat) fmt.Printf("Truncated number is: %d", truncint) } else { fmt.Printf("Input error: %s", err) } }
- 如果你有额外的数值范围校验需求,直接对
truncfloat做数值大小判断即可,不要使用Unicode处理函数来校验数值类型变量。
内容的提问来源于stack exchange,提问作者Akash Deo
相关产品推荐
相关产品推荐

