Вопрос по string, java, if-statement – Java String - Проверьте, содержит ли строка только цифры, а не буквы

154

У меня есть строка, которую я загружаю по всему приложению, и она меняется с цифр на буквы и тому подобное. У меня простойif оператор, чтобы увидеть, содержит ли он буквы или цифры, но что-то работает не совсем правильно. Вот фрагмент.

String text = "abc"; 
String number; 

if (text.contains("[a-zA-Z]+") == false && text.length() > 2) {
    number = text; 
}

Хотяtext переменная содержит буквы, условие возвращается какtrue, И&& должно быть как оба условия должны бытьtrue для того, чтобы обработатьnumber = text;

==============================

Solution:

Я смог решить эту проблему с помощью следующего кода, предоставленного комментарием к этому вопросу. Все остальные посты также действительны!

То, что я использовал, работало из первого комментария Хотя все приведенные примеры кодов, похоже, также действительны!

String text = "abc"; 
String number; 

if (Pattern.matches("[a-zA-Z]+", text) == false && text.length() > 2) {
    number = text; 
}
Почему вы проверяете text.length () & gt; 2? В чем причина? Code Enthusiastic
Error: User Rate Limit Exceededboolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x)); формаMax Malysh Сообщение. Yash
Содержит не принимает регулярное выражение в качестве входных данных. Используйте либоmatches("\\d{2,}") или попробуйте сPattern а такжеMatcher Guillaume Polet
@RedHatccPattern.matches("[a-zA-Z]+", text) == false можно упростить до!Pattern.matches("[a-zA-Z]+", text) SARose
Может ли строка иметь десятичное значение или только целочисленные значения? Doug Swain

Ваш Ответ

18   ответов
1

String

Double.parseDouble(String s)NumberFormatExceptionString

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

 или жеis a.

20
Error: User Rate Limit ExceededNumberUtil.isCreatable(String str)Error: User Rate Limit ExceededNumberUtil.isCreatable( "09" )Error: User Rate Limit ExceededfalseError: User Rate Limit Exceeded"09" contains only numbers.
0

if (ctype_digit(text) && text.length() > 2) {
    number = text; 
}
0
import java.util.*;

class Class1 {
    public static void main(String[] argh) {
        boolean ans = CheckNumbers("123");
        if (ans == true) {
            System.out.println("String contains numbers only");
        } else {
            System.out.println("String contains other values as well");

        }
    }


    public static boolean CheckNumbers(String input) {
        for (int ctr = 0; ctr < input.length(); ctr++) {
            if ("1234567890".contains(Character.valueOf(input.charAt(ctr)).toString())) {
                continue;
            } else {
                return false;
            }
        }
        return true;
    }
}
2

org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs)Error: User Rate Limit ExceededStringError: User Rate Limit ExceededfalseError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceededpublic static boolean isNumeric(String str) { if (str == null) { return false; } else { int sz = str.length(); for(int i = 0; i < sz; ++i) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } }
0

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

public class PaserNo {

    public static void main(String args[]) {

        String text = "gg";

        if (!StringUtils.isBlank(text)) {
            if (stringContainsNumber(text)) {
                int no=Integer.parseInt(text.trim());
                System.out.println("inside"+no);

            } else {
                System.out.println("Outside");
            }
        }
        System.out.println("Done");
    }

    public static boolean stringContainsNumber(String s) {
        Pattern p = Pattern.compile("[0-9]");
        Matcher m = p.matcher(s);
        return m.find();
    }
}

if (!StringUtils.isBlank(studentNbr)) {
                try{
                    if (isStringContainsNumber(studentNbr)){
                    _account.setStudentNbr(Integer.parseInt(studentNbr.trim()));
                }
                }catch(Exception e){
                    e.printStackTrace();
                    logger.info("Exception during parse studentNbr"+e.getMessage());
                }
            }

private boolean isStringContainsNumber(String s) {
        Pattern p = Pattern.compile("[0-9]");
        Matcher m = p.matcher(s);
        return m.find();
    }
0
Character first_letter_or_number = query.charAt(0);
                //------------------------------------------------------------------------------
                if (Character.isDigit())
                {

                }
                else if (Character.isLetter())
                {

                }
2

0

if (str.matches(".*[^0-9].*")) or if (str.matches(".*\\D.*"))

truefalse

6

parseInt и такие намного хуже, чем другие решения, потому что по крайней мере требуют обработки исключений.

charAt

JMH testing

Character.isDigit противPattern.matcher().matches противLong.parseLong

Тесты запускаются в режиме пропускной способности (greater is better

Results

parseLongisDigit

## Test load with 25% valid strings (75% strings contain non-digit symbols)

Benchmark       Mode  Cnt  Score   Error  Units
testIsDigit    thrpt    5  9.275 ± 2.348  ops/s
testPattern    thrpt    5  2.135 ± 0.697  ops/s
testParseLong  thrpt    5  0.166 ± 0.021  ops/s

## Test load with 50% valid strings (50% strings contain non-digit symbols)

Benchmark              Mode  Cnt  Score   Error  Units
testCharBetween       thrpt    5  16.773 ± 0.401  ops/s
testCharAtIsDigit     thrpt    5  8.917 ± 0.767  o,ps/s
testCharArrayIsDigit  thrpt    5  6.553 ± 0.425  ops/s
testPattern           thrpt    5  1.287 ± 0.057  ops/s
testIntStreamCodes    thrpt    5  0.966 ± 0.051  ops/s
testParseLong         thrpt    5  0.174 ± 0.013  ops/s
testParseInt          thrpt    5  0.078 ± 0.001  ops/s
Test suite
@State(Scope.Benchmark)
public class StringIsNumberBenchmark {
    private static final long CYCLES = 1_000_000L;
    private static final String[] STRINGS = {"12345678901","98765432177","58745896328","35741596328", "123456789a1", "1a345678901", "1234567890 "};
    private static final Pattern PATTERN = Pattern.compile("\\d+");

    @Benchmark
    public void testPattern() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                b = PATTERN.matcher(s).matches();
            }
        }
    }

    @Benchmark
    public void testParseLong() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                try {
                    Long.parseLong(s);
                    b = true;
                } catch (NumberFormatException e) {
                    // no-op
                }
            }
        }
    }

    @Benchmark
    public void testCharArrayIsDigit() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                for (char c : s.toCharArray()) {
                    b = Character.isDigit(c);
                    if (!b) {
                        break;
                    }
                }
            }
        }
    }

    @Benchmark
    public void testCharAtIsDigit() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                for (int j = 0; j < s.length(); j++) {
                    b = Character.isDigit(s.charAt(j));
                    if (!b) {
                        break;
                    }
                }
            }
        }
    }

    @Benchmark
    public void testIntStreamCodes() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                b = s.chars().allMatch(c -> c > 47 && c < 58);
            }
        }
    }

    @Benchmark
    public void testCharBetween() {
        for (int i = 0; i < CYCLES; i++) {
            for (String s : STRINGS) {
                boolean b = false;
                for (int j = 0; j < s.length(); j++) {
                    char charr = s.charAt(j);
                    b = '0' <= charr && charr <= '9';
                    if (!b) {
                        break;
                    }
                }
            }
        }
    }
}
Updated on Feb 23, 2018 Add two more cases - one using charAt instead of creating extra array and another using IntStream of char codes Add immediate break if non-digit found for looped test cases Return false for empty string for looped test cases Updated on Feb 23, 2018 Add one more test case (the fastest!) that compares char value without using stream
Error: User Rate Limit Exceeded
0









.

0

Here is my code, hope this will help you !

 
    boolean isDigit = false;

    if (text.matches("[0-9]+") && text.length() > 2) {
        isDigit = true;
    }else {
        isDigit = false;
    }

    return isDigit;
}
1

In order to simply check the string that it contains only ALPHABETS use the following code :

In order to simply check the string that it contains only NUMBER use the following code :

if (text.matches("[0-9]+"){
   // your operations
}

Error: User Rate Limit Exceeded

0

Integer.parseInt(String str)NumberFormatException

public static boolean isOnlyNumbers(String str){
        try{
            Integer.parseInt(str);
        }catch(NumberFormatException exception){
            return false;
        }
        return true;
    }

System.out.println(isOnlyNumbers("dssd")); // flase
System.out.println(isOnlyNumbers("123")); // true
System.out.println(isOnlyNumbers("123.4")); // false
299

if (text.contains("[a-zA-Z]+") == false && text.length() > 2){

чтобы:

if (text.matches("[0-9]+") && text.length() > 2) {

Вместо того, чтобы проверить, что строкаdoesn't содержит буквенные символы, убедитесь, что он содержитonly Числовые.

Если вы действительно хотите использовать числовое значение, используйтеInteger.parseInt() или жеDouble.parseDouble() как другие объяснили ниже.

Error: User Rate Limit Exceededtrue или жеfalse, Просто используйтеif (condition) или жеif (!condition).

Error: User Rate Limit Exceeded&& (text.length() > 2)Error: User Rate Limit Exceededif (text.matches("[0-9]{3,}")
Error: User Rate Limit Exceeded^[0-9]+$Error: User Rate Limit Exceededabc123defError: User Rate Limit Exceeded
Error: User Rate Limit Exceededmatches()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

if(text.matches("\\d*")&& text.length() > 2){
    System.out.println("number");
}

Integer.parseInt(String)Long.parseLong(String)

private boolean onlyContainsNumbers(String text) {
    try {
        Long.parseLong(text);
        return true;
    } catch (NumberFormatException ex) {
        return false;
    }
} 

if (onlyContainsNumbers(text) && text.length() > 2) {
    // do Stuff
}
Error: User Rate Limit Exceeded
10

if(text.matches("^[0-9]*$") && text.length() > 2){
    //...
}

$1B.

Error: User Rate Limit Exceededtext.length() > 2Error: User Rate Limit Exceeded^[0-9]*$Error: User Rate Limit Exceeded^[0-9]+$Error: User Rate Limit Exceeded

Похожие вопросы