簡體   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