Go中unicode中IsDigit和IsNumber之间的差异

时间:2014-08-28 04:52:06

标签: unicode go

似乎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)
}

2 个答案:

答案 0 :(得分:16)

一般类别是数字,子类别是十进制数字。

  

Unicode Standard

     

4. Character Properties

     

4.5一般类别

Nd = Number, decimal digit
Nl = Number, letter
No = Number, other
     

4.6数值

     

Numeric_Value和Numeric_Type是字符的标准属性   代表数字。

     

十进制数字。

     

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

例如,

Unicode Characters in the 'Number, Decimal Digit' Category (Nd)

Unicode Characters in the 'Number, Letter' Category (Nl)

Unicode Characters in the 'Number, Other' Category (No)

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

答案 1 :(得分:4)

据我所知,IsDigit()IsNumber()的一个子集,因此您获得的结果很好,因为两者都应该评估为trueIsNumber用于确定它是否在任何数字Unicode类别中,IsDigit()检查它是否为基数-10位数。