Как проверить, является ли строка числовой в Java - PullRequest
799 голосов
/ 09 июля 2009

Как бы вы проверили, была ли строка строкой, прежде чем ее проанализировать?

Ответы [ 39 ]

3 голосов
/ 19 августа 2015

Вы можете использовать объект java.util.Scanner.

public static boolean isNumeric(String inputData) {
      Scanner sc = new Scanner(inputData);
      return sc.hasNextInt();
    }
3 голосов
/ 19 декабря 2012
// only int
public static boolean isNumber(int num) 
{
    return (num >= 48 && c <= 57); // 0 - 9
}

// is type of number including . - e E 
public static boolean isNumber(String s) 
{
    boolean isNumber = true;
    for(int i = 0; i < s.length() && isNumber; i++) 
    {
        char c = s.charAt(i);
        isNumber = isNumber & (
            (c >= '0' && c <= '9') || (c == '.') || (c == 'e') || (c == 'E') || (c == '')
        );
    }
    return isInteger;
}

// is type of number 
public static boolean isInteger(String s) 
{
    boolean isInteger = true;
    for(int i = 0; i < s.length() && isInteger; i++) 
    {
        char c = s.charAt(i);
        isInteger = isInteger & ((c >= '0' && c <= '9'));
    }
    return isInteger;
}

public static boolean isNumeric(String s) 
{
    try
    {
        Double.parseDouble(s);
        return true;
    }
    catch (Exception e) 
    {
        return false;
    }
}
2 голосов
/ 05 декабря 2013

Я изменил решение CraigTP, чтобы принимать научную запись, а также точку и запятую в качестве десятичных разделителей

^-?\d+([,\.]\d+)?([eE]-?\d+)?$

пример

var re = new RegExp("^-?\d+([,\.]\d+)?([eE]-?\d+)?$");
re.test("-6546"); // true
re.test("-6546355e-4456"); // true
re.test("-6546.355e-4456"); // true, though debatable
re.test("-6546.35.5e-4456"); // false
re.test("-6546.35.5e-4456.6"); // false
2 голосов
/ 09 июля 2009

Вот почему мне нравится подход Try * в .NET. В дополнение к традиционному методу Parse, похожему на Java, у вас также есть метод TryParse. Я не очень хорошо разбираюсь в синтаксисе Java (выходных параметрах?), Поэтому, пожалуйста, отнеситесь к следующему как к некоторому псевдокоду. Это должно прояснить концепцию.

boolean parseInteger(String s, out int number)
{
    try {
        number = Integer.parseInt(myString);
        return true;
    } catch(NumberFormatException e) {
        return false;
    }
}

Использование:

int num;
if (parseInteger("23", out num)) {
    // Do something with num.
}
2 голосов
/ 09 июля 2009

Разобрать его (т.е. с Integer#parseInt) и просто перехватить исключение. =)

Для пояснения: функция parseInt проверяет, может ли она анализировать число в любом случае (очевидно), и если вы хотите разобрать его в любом случае, вы не будете терять производительность, фактически выполняя синтаксический анализ.

Если вы не хотите анализировать это (или анализировать очень, очень редко), вы, конечно, можете сделать это по-другому.

2 голосов
/ 13 ноября 2016

Вы можете использовать NumberUtils.isCreatable () из Apache Commons Lang .

Поскольку NumberUtils.isNumber устарел в версии 4.0, используйте вместо него NumberUtils.isCreatable ().

1 голос
/ 18 декабря 2018

Основываясь на других ответах, я написал свой, и он не использует шаблоны или синтаксический анализ с проверкой исключений.

Проверяется максимум один знак минус и проверяется максимум один десятичный знак.

Вот несколько примеров и их результаты:

«1», «-1», «-1,5» и «-1,556» возвращают true

"1..5", "1A.5", "1.5D", "-" и "--1" возвращают false

Примечание. При необходимости вы можете изменить это так, чтобы он принимал параметр Locale и передавал его в вызовы DecimalFormatSymbols.getInstance (), чтобы использовать определенный Locale вместо текущего.

 public static boolean isNumeric(final String input) {
    //Check for null or blank string
    if(input == null || input.isBlank()) return false;

    //Retrieve the minus sign and decimal separator characters from the current Locale
    final var localeMinusSign = DecimalFormatSymbols.getInstance().getMinusSign();
    final var localeDecimalSeparator = DecimalFormatSymbols.getInstance().getDecimalSeparator();

    //Check if first character is a minus sign
    final var isNegative = input.charAt(0) == localeMinusSign;
    //Check if string is not just a minus sign
    if (isNegative && input.length() == 1) return false;

    var isDecimalSeparatorFound = false;

    //If the string has a minus sign ignore the first character
    final var startCharIndex = isNegative ? 1 : 0;

    //Check if each character is a number or a decimal separator
    //and make sure string only has a maximum of one decimal separator
    for (var i = startCharIndex; i < input.length(); i++) {
        if(!Character.isDigit(input.charAt(i))) {
            if(input.charAt(i) == localeDecimalSeparator && !isDecimalSeparatorFound) {
                isDecimalSeparatorFound = true;
            } else return false;
        }
    }
    return true;
}
1 голос
/ 18 сентября 2018

Если вы, ребята, используете следующий метод для проверки:

public static boolean isNumeric(String str) {
    NumberFormat formatter = NumberFormat.getInstance();
    ParsePosition pos = new ParsePosition(0);
    formatter.parse(str, pos);
    return str.length() == pos.getIndex();
}

Затем, что произошло с вводом очень длинной строки, такой как я называю этот метод:

System.out.println(isNumeric("94328948243242352525243242524243425452342343948923"));

Результат "true", также это слишком большое число! То же самое произойдет, если вы используете регулярное выражение для проверки! Поэтому я бы предпочел использовать метод «разбора» для проверки, например:

public static boolean isNumeric(String str) {
    try {
        int number = Integer.parseInt(str);
        return true;
    } catch (Exception e) {
        return false;
    }
}

И результат, который я ожидал!

1 голос
/ 11 июня 2018

Я проиллюстрировал некоторые условия для проверки чисел и десятичных знаков без использования API,

Check Fix Length 1-значный номер

Character.isDigit(char)

Проверка номера фиксированной длины (предположим, что длина равна 6)

String number = "132452";
if(number.matches("([0-9]{6})"))
System.out.println("6 digits number identified");

Проверка числа переменной длины между (предположим, длина от 4 до 6)

//  {n,m}  n <= length <= m
String number = "132452";
if(number.matches("([0-9]{4,6})"))
System.out.println("Number Identified between 4 to 6 length");

String number = "132";
if(!number.matches("([0-9]{4,6})"))
System.out.println("Number not in length range or different format");

Проверить десятичное число между переменной длины (допустим, длина от 4 до 7)

//  It will not count the '.' (Period) in length
String decimal = "132.45";
if(decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Numbers Identified between 4 to 7");

String decimal = "1.12";
if(decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Numbers Identified between 4 to 7");

String decimal = "1234";
if(decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Numbers Identified between 4 to 7");

String decimal = "-10.123";
if(decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Numbers Identified between 4 to 7");

String decimal = "123..4";
if(!decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Decimal not in range or different format");

String decimal = "132";
if(!decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Decimal not in range or different format");

String decimal = "1.1";
if(!decimal.matches("(-?[0-9]+(\.)?[0-9]*){4,6}"))
System.out.println("Decimal not in range or different format");

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

1 голос
/ 24 мая 2018

Параллельная проверка для очень длинных строк с использованием IntStream

В Java 8 следующие тесты проверяют, все ли символы данного string находятся в пределах от «0» до «9». Имейте ввиду, что пустая строка принята:

string.chars().unordered().parallel().allMatch( i -> '0' <= i && '9' >= i )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...