为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中 unicode 中 IsDigit 和 IsNumber 的区别

Go 中 unicode 中 IsDigit 和 IsNumber 的区别

Go
呼唤远方 2021-08-10 21:09:43
似乎 unicode 包中的 IsDigit 和 IsNumber 的行为没有不同,至少在我的以下测试代码中:package mainimport "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)}
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

总类为数字,子类为十进制数字。


统一码标准


4. 角色属性


4.5 一般类别


Nd = Number, decimal digit

Nl = Number, letter

No = Number, other

4.6 数值


Numeric_Value 和 Numeric_Type 是表示数字的字符的规范属性。


十进制数字。


通常理解的十进制数字是用于形成十进制基数的数字。


例如,


“数字,十进制数字”类别中的 Unicode 字符 (Nd)


“数字、字母”类别 (Nl) 中的 Unicode 字符


“数字、其他”类别中的 Unicode 字符(否)


package main


import (

    "fmt"

    "unicode"

)


func main() {

    digit := rune('1')

    fmt.Println(unicode.IsDigit(digit))

    fmt.Println(unicode.IsNumber(digit))

    letter := rune('Ⅷ')

    fmt.Println(unicode.IsDigit(letter))

    fmt.Println(unicode.IsNumber(letter))

    other := rune('½')

    fmt.Println(unicode.IsDigit(other))

    fmt.Println(unicode.IsNumber(other))

}

输出:


true

true

false

true

false

true


查看完整回答
反对 回复 2021-08-10
?
月关宝盒

TA贡献1772条经验 获得超5个赞

据我所知IsDigit()是一个子集,IsNumber()所以你得到的结果很好,因为两者都应该评估为true. 的IsNumber是使用以确定它是否是任何数值Unicode类别和IsDigit()检查它是否是一个基数为10位数..


查看完整回答
反对 回复 2021-08-10
  • 2 回答
  • 0 关注
  • 968 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信