前言
在日常应用中,我们需要对输入的手机号码,银行卡号码等进行校验判断,确保其数据有效性后才入库。那么如何判断输入的字符串是数字呢。这里举例3种方法。
判断方法
/**
* JAVA自带的函数
*
* @param str
* @return
*/
public static boolean isNumerA(String str) {
for (int i = str.length(); --i >= 0; ) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
}
/**
* 正则
*
* @param str
* @return
*/
public static boolean isNumberB(String str) {
Pattern pattern = Pattern.compile("[\\d]*");
return pattern.matcher(str).matches();
}
/**
* ASCII
*
* @param str
* @return
*/
public static boolean isNumerC(String str) {
for (int i = str.length(); --i >= 0; ) {
int chr = str.charAt(i);
if (chr < 48 || chr > 57)
return false;
}
return true;
}
主函数
public static void main(String[] args) {
String number = "1";
long startTime;
long endTime;
boolean a = false;
boolean b = false;
boolean c = false;
startTime = System.currentTimeMillis();
for (int i = 0; i <= 100000; i++) {
a = StringUtil.isNumerA(number);
}
endTime = System.currentTimeMillis();
System.out.println("JAVA自带函数\t" + a + "\t" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i <= 100000; i++) {
b = StringUtil.isNumberB(number);
}
endTime = System.currentTimeMillis();
System.out.println("正则\t" + b + "\t" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i <= 100000; i++) {
c = StringUtil.isNumerC(number);
}
endTime = System.currentTimeMillis();
System.out.println("ASCII\t" + c + "\t" + (endTime - startTime));
}
效率比较
这里每种长度的字符串计算运行3次的平均值
方法 | 1位 | 5位 | 10位 | 15位 | 20位 |
---|---|---|---|---|---|
方法A用时 | 7 | 9 | 10 | 12 | 12 |
方法B用时 | 100 | 88 | 95 | 95 | 97 |
方法C用时 | 3 | 4 | 5 | 4 | 5 |
虽然只是粗糙地进行了效率比较。但是我们还是可以明显的看出。使用ASCII方法判断的效率最高,其次是JAVA自带的函数,最低的是用正则表达式进行判断。
这就结束了?
那我们用到小数点".“和”+\-"的情况怎么办?所以,来对这个util进行一点改造
以下贴出全部代码
import util.StringUtil;
public class TestMain {
public static void main(String[] args) {
String number = "+1234567890.1234567890";
long startTime;
long endTime;
boolean a = false;
boolean b = false;
boolean c = false;
startTime = System.currentTimeMillis();
for (int i = 0; i <= 100000; i++) {
a = StringUtil.isNumerA(number);
}
endTime = System.currentTimeMillis();
System.out.println("JAVA自带函数\t" + a + "\t" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i <= 100000; i++) {
b = StringUtil.isNumberB(number);
}
endTime = System.currentTimeMillis();
System.out.println("正则\t" + b + "\t" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i <= 100000; i++) {
c = StringUtil.isNumerC(number);
}
endTime = System.currentTimeMillis();
System.out.println("ASCII\t" + c + "\t" + (endTime - startTime));
}
}
package util;
import java.util.regex.Pattern;
public class StringUtil {
/**
* JAVA自带的函数
*
* @param str
* @return
*/
public static boolean isNumerA(String str) {
StringBuilder stringBuilder = deleteChar(str);
for (int i = stringBuilder.length(); --i >= 0; ) {
if (!Character.isDigit(stringBuilder.charAt(i))) {
return false;
}
}
return true;
}
/**
* 正则
*
* @param str
* @return
*/
public static boolean isNumberB(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*\\.?[\\d]*");
return pattern.matcher(str).matches();
}
/**
* ASCII
*
* @param str
* @return
*/
public static boolean isNumerC(String str) {
if("".equals(str)){
return false;
}
StringBuilder stringBuilder = deleteChar(str);
for (int i = stringBuilder.length(); --i >= 0; ) {
int chr = stringBuilder.charAt(i);
if (chr < 48 || chr > 57)
return false;
}
return true;
}
public static StringBuilder deleteChar(String str) {
int flag;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str);
if (stringBuilder.charAt(0) == '+' || stringBuilder.charAt(0) == '-') {
stringBuilder.deleteCharAt(0);
}
if ((flag = stringBuilder.indexOf(".")) != -1) {
stringBuilder.deleteCharAt(flag);
}
return stringBuilder;
}
}
结尾
看了好几篇博客。都是说正则是效率最高的。求求你们别抄了,没有意义的,拜托自己动手做一做吧。