Java 验证字符串是否只有数字
我的Java应用程序“A”正在从另一个Java应用程序获取移动电话号码作为字符串。因此,在应用程序A获取手机号码字符串后,我需要验证该手机号码字符串中是否只有数字。为了验证我使用了如下的简单逻辑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))) {
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)中运行(怎么可能不呢?!),其他所有可能的方法也是如此。移动电话号码可以包含各种数字字符,如您所述,最值得注意的是+
')符号。还有空格、括号、斜杠、破折号和其他一些东西。你确定你需要字符串是纯数字的吗?使用正则表达式并没有那么昂贵,特别是对于预编译的正则表达式,它是文本输入验证的完美解决方案。事实上,创建流也很昂贵。