JAVA判断字符串为数字的几种方法以及其效率比较

本文探讨了三种在Java中验证数字字符串有效性的方法:使用JAVA内置函数、正则表达式和ASCII码。通过效率测试,发现ASCII方法效率最高,其次是JAVA内置函数,而正则表达式效率最低。文章还提供了代码示例,并对验证包含小数点和符号的数字进行了改进。
摘要由CSDN通过智能技术生成

前言

在日常应用中,我们需要对输入的手机号码,银行卡号码等进行校验判断,确保其数据有效性后才入库。那么如何判断输入的字符串是数字呢。这里举例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用时79101212
方法B用时10088959597
方法C用时34545

虽然只是粗糙地进行了效率比较。但是我们还是可以明显的看出。使用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;
	}
}

结尾

看了好几篇博客。都是说正则是效率最高的。求求你们别抄了,没有意义的,拜托自己动手做一做吧。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值