在解析字符串之前,如何检查它是否是一个数字?


当前回答

使用IntStream并行检查非常长的字符串

在Java 8中,以下测试给定字符串的所有字符是否都在'0'到'9'之间。注意空字符串是被接受的:

string.chars().unordered().parallel().allMatch( i -> '0' <= i && '9' >= i )

其他回答

这就是为什么我喜欢。net中的Try*方法。除了像Java一样的传统Parse方法之外,还有一个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.
}

我认为唯一可靠地判断字符串是否是数字的方法是解析它。所以我只是解析它,如果它是一个数字,你可以免费得到整数形式的数字!

您可以使用Apache Commons Lang中的NumberUtils.isCreatable()。

因为NumberUtils。isNumber将在4.0中被弃用,所以使用NumberUtils.isCreatable()代替。

如果您想使用正则表达式进行检查,则应该创建一个最终的静态Pattern对象,这样正则表达式只需要编译一次。编译正则表达式所花费的时间与执行匹配所花费的时间差不多,因此通过采取这种预防措施,您可以将方法的执行时间缩短一半。

final static Pattern NUMBER_PATTERN = Pattern.compile("[+-]?\\d*\\.?\\d+");

static boolean isNumber(String input) {
    Matcher m = NUMBER_PATTERN.matcher(input);
    return m.matches();
}

我假设一个数字是一个只有十进制数字的字符串,可能在开头有一个+或-号,最多有一个小数点(不是在结尾),没有其他字符(包括逗号、空格、其他计数系统中的数字、罗马数字、象形文字)。

这个解决方案非常简洁和快速,但是通过这样做,每百万次调用可以节省几毫秒的时间

static boolean isNumber(String s) {
    final int len = s.length();
    if (len == 0) {
        return false;
    }
    int dotCount = 0;
    for (int i = 0; i < len; i++) {
        char c = s.charAt(i);
        if (c < '0' || c > '9') {
            if (i == len - 1) {//last character must be digit
                return false;
            } else if (c == '.') {
                if (++dotCount > 1) {
                    return false;
                }
            } else if (i != 0 || c != '+' && c != '-') {//+ or - allowed at start
                return false;
            }

        }
    }
    return true;
}
import java.util.Scanner;

public class TestDemo {
    public static void main(String[] args) {
        boolean flag = true;
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the String:");
        String str = sc.nextLine();

        for (int i = 0; i < str.length(); i++) {
            if(str.charAt(i) > 48 && str.charAt(i) < 58) {
                flag = false;
                break;
            }
        }

        if(flag == true) {
            System.out.println("String is a valid String.");
        } else {
            System.out.println("String contains number.");
        }
    }
}