2013-10-06 6 views
1

Мне нужно взять ввод, содержащий большие числа порядка 10^9 в Java. Как быстро обрабатывать Входы? Кроме того, поскольку streamtokenizer.nval дает двойной, как я могу читать большие значения?Streamtokenizer для чтения очень больших чисел?

+1

Вы можете попробовать 'BigDecimal' – BackSlash

+0

, которые не помогут в принятии ввода. Ни при преобразовании из double в BigInteger. – Renegade403

+0

1. Вы можете принять ввод как 'String', передать его конструктору' BigDecimal'; 2. Преобразование из 'double' в' BigInteger' не имеет смысла, потому что _it для integers_ и потому, что такие большие значения не представляются с помощью 'double', поэтому вы бы конвертировали неправильное значение. – BackSlash

ответ

0

Перед разбором, сбросить таблицу синтаксиса токенизатора и инициализировать его распознавать числа как слова:

StreamTokenizer tokenizer = new StreamTokenizer(r); 
tokenizer.resetSyntax(); 

tokenizer.whitespaceChars(0, 32); 

tokenizer.wordChars('0', '9'); 
tokenizer.wordChars('-', '.'); 
tokenizer.wordChars('+', '+'); 
tokenizer.wordChars('a', 'z'); 
tokenizer.wordChars('A', 'Z'); 
tokenizer.wordChars(0xa0, 0xff); // not really needed here. */ 
tokenizer.slashSlashComments(true); 
tokenizer.slashStarComments(true); 

tokenizer.quoteChar('"'); 
tokenizer.quoteChar('\''); 

Затем, когда встречая слово, вы проверить, является ли это распознаваемо как число (немного сырым здесь, но это показывает, общая идея):

... 
case StreamTokenizer.TT_WORD: 
    if ("true".equals(tokenizer.sval)) { 
    result = Boolean.TRUE; 
    } else if ("false".equals(tokenizer.sval)) { 
    result = Boolean.FALSE; 
    } else if ("null".equals(tokenizer.sval)) { 
    result = null; 
    } else { 
    try { 
     result = Long.parseLong(tokenizer.sval); 
    } catch(NumberFormatException e) { 
     try { 
     result = Double.parseDouble(tokenizer.sval); 
     } catch (NumberFormatException e2) { 
     throw new IllegalStateException(
      "Unexpected token: " + tokenizer.toString()); 
     } 
    } 
} 
tokenizer.nextToken(); 
break; 

ли это работает, зависит от случая использования: Если вы хотите, чтобы разобрать выражения (а не только в формате JSON, как в моем случае), вы, вероятно, не хотите, чтобы установить + или - как символ слова с, но общая идея должна по-прежнему работать, рассматривая их как унарные операторы и обнаруживая константы на более позднем этапе.

 Смежные вопросы

  • Нет связанных вопросов^_^