繁体   English   中英

Character.isDigit 返回什么?

[英]What does Character.isDigit return?

我在网上找到了这个例子。 peek 包含使用readch(br)从缓冲读取器读取的一个字符。 下一个循环必须继续,直到读取的字符是一个数字

while(Character.isDigit(peek) 
    && !Character.isLetter(peek) && peek != '_') {
    int n = (int) peek - 48;
    sum = sum*10 + n;
    readch(br);
}

仅仅说Character.isDigit还不够吗?

是的,这是多余的。 如果字符类型(来自Character.getType )是DECIMAL_DIGIT_NUMBER ,则Character.isDigit返回 true ,如果相同类型是多个类别之一( DECIMAL_DIGIT_NUMBER不是列出的类别之一),则Character.isLetter返回 true 。

getType返回单个值,因此根据 Java 不存在具有多种类型的字符。 因此,没有isDigitisLetter都返回 true 的字符。 同样, _CONNECTOR_PUNCTUATION (通过快速示例 Java 程序很容易看到这一点),它既不是数字也不是字母。

所以这是一个过度防御的人的代码。 isDigit就足够了。

样本只完成了一半的工作。

它假定Character::isDigit仅对字符 '0' 到 '9' 返回true ,但这是错误的。 这也意味着计算(int) peek - 48不能可靠地得到数字的数值。

当代码应该真正适用于任何类型的数字时,它需要如下所示:

final var radix = 10;
var value = 0;
while( Character.isDigit( peek) && ((value = Character.digit( peek, radix )) != -1) ) 
{
  sum = sum * radix + value;
  readch( br );
}

要覆盖从 'A' 到 'F' 的十六进制数字或它们的小写等价物,只需删除Character::isDigit检查(并相应地更改radix )。

使用Character::getNumericValue也可以获得罗马数字,但这对于sum的计算将无法正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM