Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 验证字符串是否只有数字_Java_Regex_String_Performance_Parsing - Fatal编程技术网

Java 验证字符串是否只有数字

Java 验证字符串是否只有数字,java,regex,string,performance,parsing,Java,Regex,String,Performance,Parsing,我的Java应用程序“A”正在从另一个Java应用程序获取移动电话号码作为字符串。因此,在应用程序A获取手机号码字符串后,我需要验证该手机号码字符串中是否只有数字。为了验证我使用了如下的简单逻辑 public static boolean containsOnlyDigits(String str, int n) { for (int i = 1; i < n; i++) { if (!Character.isDigit(str.charAt(i))) {

我的Java应用程序“A”正在从另一个Java应用程序获取移动电话号码作为字符串。因此,在应用程序A获取手机号码字符串后,我需要验证该手机号码字符串中是否只有数字。为了验证我使用了如下的简单逻辑

public static boolean containsOnlyDigits(String str, int n) {
    for (int i = 1; i < n; i++) {
        if (!Character.isDigit(str.charAt(i))) {
            return false;
        }
    }
    return true;
}
public静态布尔值containsOnlyDigits(String str,int n){
对于(int i=1;i
我从I=1开始检查,因为国家代码的第一个字符将是“+”。这种方法是O(n)。还有另一种方法,我们可以使用
Double.parseDouble(str)
。这将抛出<代码> No.MultFrimeExtabor >代码>,以便我们可以捕获并考虑它是一个字母数字字符串。

以下哪种方法最适合基于性能

我从I=1开始检查,因为国家代码的第一个字符将是“+”

您可以使用正则表达式,
\+\d{n-1}
,这意味着第一个字符是
+
,其余的
n-1
字符是数字。这还意味着字符串的总长度应为
n

public class Main {
    public static void main(String[] args) {
        // Tests
        System.out.println(containsOnlyDigits("+123456789", 10));
        System.out.println(containsOnlyDigits("+123456789", 9));
        System.out.println(containsOnlyDigits("+123456789", 8));
        System.out.println(containsOnlyDigits("-123456789", 9));
        System.out.println(containsOnlyDigits("123456789", 9));
        System.out.println(containsOnlyDigits("ABC123456", 9));
    }

    public static boolean containsOnlyDigits(String str, int n) {
        String regex = "\\+\\d{" + (n - 1) + "}";
        return str.matches(regex);
    }
}
输出:

true
false
false
false
false
false

您可以尝试删除
+
,如果没有用:

 /**
 * Assuming that a phone number is of an international format, having `+` sign as prefix
 * and with no spaces in between the numbers, validates if a string is a valid phone number.
 * 
 * @param phone
 * @return resulting boolean
     */
private boolean isValidPhoneNumber(String phone) {
    if(phone == null) return false;
    
    return Pattern.matches("\\+\\d{11,15}", phone);
}

使用正则表达式代价高昂。因此,您可以使用Java8中的lambda表示法轻松解决这个问题

boolean numericControl = str.chars().allMatch(x -> Character.isDigit(x));

在它的内部,Double#parseDouble使用一个带isDigit的循环…但是最好编写一个JMH测试来验证。“这种方法是O(n)”-当然是。有什么问题吗?@KonradRudolph我想知道我们是否可以使用Double.parseDouble而不是使用我们自己的实现,以及它对性能的影响。@Sel_va我仍然不理解这个异议,因为
Double.parseDouble
显然也在O(n)中运行(怎么可能不呢?!),其他所有可能的方法也是如此。移动电话号码可以包含各种数字字符,如您所述,最值得注意的是
+
')符号。还有空格、括号、斜杠、破折号和其他一些东西。你确定你需要字符串是纯数字的吗?使用正则表达式并没有那么昂贵,特别是对于预编译的正则表达式,它是文本输入验证的完美解决方案。事实上,创建流也很昂贵。