2015-07-23 5 views
0

Я пытаюсь разобрать строку безопасно,Проверьте число слишком велико или не число

public <T> long safeParseLong(T s){ 
    try { 
     return Long.parseLong(s.toString()); 
    }catch (NumberFormatException e){ 
     return 0; 
    } 
} 

Это всегда будет работать, и если строка не интерпретируемая, он возвращает 0.

Однако есть ли способ узнать, что причина в том, чтобы он был неповторим? В частности, я хочу знать, не является ли это числом ("foo") или слишком большим номером (≥ 9223372036854775808).

+0

Наивный подход состоит в том, чтобы использовать регулярное выражение и проверить, имеет ли он числовое, но имеет слишком много цифр. – Falmarri

+1

Мне не нравится этот «безопасный» метод. Что происходит, например, s = «0»? Откуда вы знаете, была ли это ошибка или это было фактическое значение? И s = null? – m0skit0

+3

Разделите его на https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#BigInteger-java.lang.String- и выполните проверку вручную перед вызовом 'longValue() '. – Marco13

ответ

3

The Long.parseLong метод выбросит NumberFormatException, если строка не является числом или, если число не помещается в long.

Если исключение выбрано, проверьте, соответствует ли строка правильному выражению для числа, "[+-]?[0-9]+". Если он совпадает, это число, которое не может быть помещено в long. Если это не соответствует, то это не было числом, например. "foo".

boolean isNumber = s.toString().matches("[+-]?[0-9]+"); 

Но вы возвращаете 0, если произошла ошибка. Это неотличимо от того, было ли содержимое строки "0". Возможно, было бы лучше исключить исключение из этого метода. Но вместо вы можете создать и выбросить NotANumberException, если это не числовая строка, или NumberMagnitudeTooLargeException, если синтаксический анализ завершился неудачно, потому что он слишком велик, чтобы соответствовать long.

-1

К сожалению, Long.parseLong выкинет NumberFormatException в любом случае.

Long.parseLong(new String(new BigInteger(Long.toString(Long.MAX_VALUE)).add(new BigInteger("1")).toString())); 

приводит:

Exception in thread "main" java.lang.NumberFormatException: For input string: "9223372036854775808" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Long.parseLong(Unknown Source) 
    at java.lang.Long.parseLong(Unknown Source) 
    at Main.main(Main.java:13) 
Смежные вопросы