2015-07-07 2 views
0

Я знаю, что этот вопрос был опубликован много, и я проверил некоторые решения, но никто не работал отлично для меня.Рабочее решение для проверки строки только для целых чисел?

Я хочу проверить, действительно ли Stringinput в TextField действителен или нет. Допустимые значения - это только целые положительные числа, т. Е. Все, что есть> = 0 и целое число.

Я попробовал решение что-то вроде этого, что я нашел:

try { 
    int input = Integer.valueOf(fieldwaitAfterAction.getText()); 
    if(input < 0)) { 
     validInput = false; 
    } else { 
     validInput = true; 
    } 
} catch(NumberFormatException e) { 
    validInput = false; 
} 

Работы для большинства неправильных моделей хорошо, но если я ввожу что-то вроде «+0» или «-0» она проходит через которые не должно быть на самом деле. Так что я хочу чистое целое число без символов в начале, в промежутке или в конце.

Что было бы лучшим решением для этой проблемы?

Большое спасибо!

+0

Вы встречались с регулярным выражением? – jgitter

+0

@tim этот не работает для меня, не знаю почему. встречается с регулярным выражением, но не знает, какова должна быть правильная «формула» для каждого символа и рисунка. –

ответ

0

Для меня это всегда делать магию ....

try { 
    Integer.parseInt(theStringToEval); 
    // is this line is reach.. it is a int 
    } 
    catch (NumberFormatException e){ 
    // is the flow goes here 
    } 

Но это дает целое с признаками ... Вы можете создать метод для удобства, что это скрыть детали реализации и добавьте чек знаки там ...

public static boolean isPlainInteger (String string) { 
    if (string.startsWith("-") || string.startsWith("+")) { 
     return false; 
    } 

    try { 
     Integer.parseInt(string); 
     return true; 
    } 
    catch (NumberFormatException e){ 
     return false; 
    } 
    } 

И вы можете достичь этого через регулярное выражение тоже .... возможно, это могло бы помочь.

private static Pattern plainIntegerPattern = Pattern.compile("\\d+"); 
public static boolean isPlainInteger (String string) { 
    return plainIntegerPattern.matcher(string).matches(); 
} 

Надеюсь, это поможет.

2
public static boolean checkForDigits(final String toCheck){ 
    boolean flag = true; 
    char[] toCheckArray = toCheck.toCharArray(); 
    for(int index=0; index < toCheckArray.length, flag==true; index++){ 
     if(! (((int)toCheckArray[index] > 47) && ((int)toCheckArray[index] < 58))){ 
      flag = false; 
     } 
    } 
    return flag; 
} 

Там вы идете. Он возвращает true, если все цифры, false, если это не так. Это наихудший случай времени O (n). < O (n), если он обнаруживает что-либо, кроме цифры.

+0

ey Charles ... как и вы, тоже .. но я должен делать это внутри цикла 'flag = (! (((int) toCheckArray [index]> 47) && ((int) toCheckArray [index] <58))) '. Присвоить логический результат непосредственно переменной;), более прямо, не так ли? – Victor

+0

Почти правильно, за исключением того, чтобы сделать особый случай для первого символа, чтобы проверить, равен ли он 0. Если это так, и строка содержит что-либо еще, это неверно. – Orch

+0

Виктор, это не так. Я не хочу тратить время на присвоение ценности, когда это не нужно. Я, честно говоря, должен просто поставить return false вместо использования флага вообще. Орк, он никогда не указывал этот случай. Все целые числа действительны и 024 по-прежнему является целым числом. –

2

Я думаю, что вы забыли положить = to.If я понял ваш вопрос правильно, это должно решить вашу проблему:

try{ 
       String input_string=fieldwaitAfterAction.getText() 

       int input = Integer.valueOf(input_string); 
       if(input <= 0)){ 
        validInput = false; 

       } 
       else{ validInput = true; } 
       } 
       catch(NumberFormatException e){ 
        validInput = false; 
} 
+0

Это не относится к его проблеме с + или - – Orch

+0

@orch, если мы вводим +9 +0 в качестве входной строки, она отлично работает. Можете ли вы помочь мне разобраться в проблеме? –

2

Вы можете использовать Regex ^\d+$, чтобы проверить, если вход содержит только положительное число.

^ assert position at start of the string 
\d+ match a digit [0-9] 
    Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy] 
$ assert position at end of the string 

В Java-код:

String[] arr = { "-123", "123a", "0", "123" }; 
String regex = "^\\d+$"; 
for (String str : arr) { 
    Matcher matcher = Pattern.compile(regex).matcher(str); 
    if (matcher.find()) 
    System.out.println("String " + str + " is a positive number."); 
    else 
    System.out.println("String " + str + " is NOT a positive number."); 
} 

печатает

String -123 is NOT a positive number. 
String 123a is NOT a positive number. 
String 0 is a positive number. 
String 123 is a positive number. 
0

Integer.ValueOf позволяет + анс - знаки. В соответствии с javadoc

... Символы в строке должны быть цифрами указанного радиуса (как определено с помощью java.lang.Character.цифра (символ, целое) возвращает неотрицательное значение), за исключением того, что первый символ может представлять собой ASCII знак минус «-», чтобы указать отрицательное значение или ASCII знак плюс «+», чтобы указать положительное значение

Таким образом, ваш код будет разбит на любое значение, имеющее +, за которым следует целое число, а также +0 и -0, так как оба из них будут представлены как 0. Я дам решение, используя регулярное выражение.

String str = fieldwaitAfterAction.getText(); 
if (str == null) { 
    retrun false; 
} 
String regex = "^(\\d+)$"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(str); 
if (matcher.matches()) { 
    int val = Integer.valueOf(matcher.group(0)); 
    if (val > 0) { 
     return true; 
    } 
} 
retrun false; 

Таким образом, вы могли бы справиться с ситуацией, как 088 не является допустимым входом для вас с помощью Reges ^[^0](\\d+)$.

0

Проверяет, является ли данный ввод целочисленным, а не действительным целым Java Integer (Integer.MAX_VALUE).

validInput = fieldwaitAfterAction.getText().length > 0 
       && fieldwaitAfterAction.getText().matches("[0-9]+"); 
0

Вы можете использовать простое регулярное выражение, как "(^ 0 | [1-9] * \ d) $". Это позволяет вам поставить 0 или любое положительное целое число.

fieldwaitAfterAction.getText().matches("(^0|[1-9]*\\d)$") 

Помните, что с помощью регулярных выражений, как \ D + не будет работать, потому что он принимает строки, как «001243»

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