似乎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)
}
答案 0 :(得分:16)
一般类别是数字,子类别是十进制数字。
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()
的一个子集,因此您获得的结果很好,因为两者都应该评估为true
。 IsNumber
用于确定它是否在任何数字Unicode类别中,IsDigit()
检查它是否为基数-10位数。