Go 中 unicode 中 IsDigit 和 IsNumber 的区别

似乎 unicode 包中的 IsDigit 和 IsNumber 的行为没有不同,至少在我的以下测试代码中:


package main


import "fmt"

import "unicode"


func main() {

    r := rune('1')

    fmt.Println(unicode.IsDigit(r))

    fmt.Println(unicode.IsNumber(r))

    //true

    //true

}

他们都打印true。


我试图从他们的源代码中理解。但是,即使从它们的源代码来看,我仍然不明白它们之间的区别是什么。


// IsNumber reports whether the rune is a number (category N).

func IsNumber(r rune) bool {

    if uint32(r) <= MaxLatin1 {

        return properties[uint8(r)]&pN != 0

    }

    return isExcludingLatin(Number, r)

}



// IsDigit reports whether the rune is a decimal digit.

func IsDigit(r rune) bool {

    if r <= MaxLatin1 {

        return '0' <= r && r <= '9'

    }

    return isExcludingLatin(Digit, r)

}


呼唤远方
浏览 969回答 2
2回答

翻阅古今

总类为数字,子类为十进制数字。统一码标准4. 角色属性4.5 一般类别Nd = Number, decimal digitNl = Number, letterNo = Number, other4.6 数值Numeric_Value 和 Numeric_Type 是表示数字的字符的规范属性。十进制数字。通常理解的十进制数字是用于形成十进制基数的数字。例如,“数字,十进制数字”类别中的 Unicode 字符 (Nd)“数字、字母”类别 (Nl) 中的 Unicode 字符“数字、其他”类别中的 Unicode 字符(否)package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "unicode")func main() {&nbsp; &nbsp; digit := rune('1')&nbsp; &nbsp; fmt.Println(unicode.IsDigit(digit))&nbsp; &nbsp; fmt.Println(unicode.IsNumber(digit))&nbsp; &nbsp; letter := rune('Ⅷ')&nbsp; &nbsp; fmt.Println(unicode.IsDigit(letter))&nbsp; &nbsp; fmt.Println(unicode.IsNumber(letter))&nbsp; &nbsp; other := rune('½')&nbsp; &nbsp; fmt.Println(unicode.IsDigit(other))&nbsp; &nbsp; fmt.Println(unicode.IsNumber(other))}输出:truetruefalsetruefalsetrue

月关宝盒

据我所知IsDigit()是一个子集,IsNumber()所以你得到的结果很好,因为两者都应该评估为true.&nbsp;的IsNumber是使用以确定它是否是任何数值Unicode类别和IsDigit()检查它是否是一个基数为10位数..
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go