首页 > 解决方案 > 在 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

标签: gounicodetruncationfloat64

解决方案


该函数unicode.IsNumber()需要一个符文,例如'0'or '9'。虽然您确实传递了一个符文,但包含的值只是代码点 55 和 58 映射到的任何值。您将通过添加:

fmt.Println(string(rune(truncfloat)))

这将打印7for55: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)

推荐阅读