Java判断一个字符串为数字(正负、小数)

本文介绍了三种判断字符串是否为数字的方法:使用Character.isDigit()、类型转换和正则表达式,并强调了正则表达式的全面性和灵活性。

转载:http://www.tuicool.com/articles/fARzUjV

原文  http://renpeijia17.iteye.com/blog/2076982

       这些天因为工作上的需求,其中一个小环节是传来一个String类型的参数,需要判断该参数是否为数字(正负、正数小数都要能判断)。

       当走到这个环节时,首先想到的是isDigit()方法,具体不清楚是哪个类下的了,不过查API后发现该方法不可行,它只能判断正整数。不过为了以后可能会用到该方法,所以特意写了个小程序当备用。

      代码如下:

//采用Character.isDigit()方法来判断一个字符串是否为数字
//局限性很大,只能判断全是数字的字符串
char[] strArr = str.toCharArray();
int count = 0;
for(int i = 0; i < strArr.length; i++) {
    if(Character.isDigit(strArr[i]) == false) {
        count++;
    }
}
if(count > 0) {
    System.out.println("Is not Number!");
} else {
    System.out.println("Is Number!" + str);
}

        后来通过百度,又找到了另外两种方法,一种是通过强制类型转换的方式,一种就是正则表达式了。

        对于强制类型转换的方式,代码可以这样写:

//采用强制类转换来判断一个字符串是否为数字
//有局限性,如果要判断是int型或double型,就必须要调整转换语句,但可以判断正负
try {
	//Integer num = Integer.valueOf(str);
	Double num2 = Double.valueOf(str);
	//System.out.println("Is Number!" + num);
	System.out.println("Is Number!" + num2);
} catch (Exception e) {
	System.out.println("Is not Number!");
}

       最后能解决我问题的,还是通过正则表达式的方式了。

       代码如下:

//采用正则表达式的方式来判断一个字符串是否为数字,这种方式判断面比较全
//可以判断正负、整数小数
Boolean strResult = str.matches("-?[0-9]+.*[0-9]*");
if(strResult == true) {
    System.out.println("Is Number!");
} else {
    System.out.println("Is not Number!");
}

       通过这次的问题,我也发现了自身的不足。正则表达式确实很牛,但是我对它的认识,还停留在了解阶段。所以后续工作中,一定要有意识的多去学习它,使用它。


<think>我们参考用户提供的引用内容,并结合Java语言特性,总结判断字符串是否仅为数字的几种方法。 注意:用户要求判断字符串是否只包含数字”,即整个字符串由0-9组成,不包含其他任何字符(包括正负号、小数点等)。 根据引用内容,有以下几种方法: 1. 使用Java自带函数Character.isDigit()遍历字符串(引用[1]方法一、五;引用[2];引用[3]方法一、三) 注意:需要处理空字符串的情况。 2. 使用正则表达式(引用[1]方法二、三、四;引用[3]方法二) 例如:正则表达式"^[0-9]*$" 或 "^\\d*$" 可以匹配纯数字(包括空字符串),但通常我们会要求至少一个数字,所以用"^[0-9]+$"。 3. 使用ASCII码(引用[1]方法五;引用[3]方法三) 我们根据需求(判断字符串是否只包含数字)给出以下方法: 方法一(推荐):正则表达式(最简洁) 使用String.matches方法,正则表达式为:^[0-9]+$ (要求至少一个数字)或者 ^[0-9]*$ (允许空字符串) 根据需求,如果我们不允许空字符串,则用"^[0-9]+$"。 方法二:遍历字符串,使用Character.isDigit()判断每个字符。 方法三:使用ASCII码范围判断(每个字符在'0'到'9'之间) 注意:引用中有一些方法可以处理负数或小数,但这里我们只需要纯数字(非负整数)。 下面分别实现: 方法一(正则表达式): public static boolean isNumeric(String str) { // 要求非空且全部为数字,至少一个数字 return str != null && str.matches("[0-9]+"); // 如果允许空字符串,则用"[0-9]*" } 方法二(遍历+Character.isDigit): public static boolean isNumeric(String str) { if (str == null || str.isEmpty()) { return false; // 如果允许空字符串,则去掉str.isEmpty()判断,或者改为return str!=null && str.isEmpty()? true: ... 但通常不允许空 } for (char c : str.toCharArray()) { if (!Character.isDigit(c)) { return false; } } return true; } 方法三(ASCII码): public static boolean isNumeric(String str) { if (str == null || str.isEmpty()) { return false; } for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c < '0' || c > '9') { return false; } } return true; } 性能:对于短字符串,三种方法性能差异不大。对于长字符串正则表达式在第一次匹配失败时可能较快返回,但编译正则表达式有一定开销。如果多次调用,可以考虑预编译正则表达式。 另外,引用[1]中推荐第二种方法(正则表达式)最快,但实际上正则表达式的效率取决于具体实现和字符串长度。在多次调用时,预编译正则表达式可以提高效率。 因此,我们可以提供两种正则表达式的方法: 1. 使用String.matches,内部每次都会编译正则表达式,适合单次调用。 2. 预编译正则表达式,适合多次调用。 下面我们给出完整的推荐方法: 方法1:使用预编译正则表达式(多次调用高效) private static final Pattern pattern = Pattern.compile("^[0-9]+$"); public static boolean isNumeric(String str) { if (str == null) { return false; } return pattern.matcher(str).matches(); } 方法2:使用Character.isDigit遍历(简单直观) 根据需求选择,如果调用频繁且字符串较长,预编译正则表达式效率更高;如果只是偶尔使用,遍历方法同样高效且无需创建Pattern对象。 注意:我们这里要求字符串非空且至少有一个数字。 测试用例: "123" -> true "" -> false null -> false "12a3" -> false "0" -> true 现在,我们按照用户要求,给出Java判断字符串是否仅为数字的方法。 </think> ### Java 判断字符串是否只包含数字的方法 在 Java 中检查字符串是否**仅包含数字**(0-9),以下是推荐方法: --- #### 1. **正则表达式法(推荐)** ```java public static boolean isOnlyDigits(String str) { return str != null && str.matches("\\d+"); } // 测试 System.out.println(isOnlyDigits("12345")); // true System.out.println(isOnlyDigits("12a45")); // false System.out.println(isOnlyDigits("")); // false ``` - **正则解释**:`\\d+` 匹配一个或多个数字字符 - **优点**:简洁高效,一行代码解决[^1][^3] - **注意**:需处理 `null` 值 --- #### 2. **字符遍历法** ```java public static boolean isOnlyDigits(String str) { if (str == null || str.isEmpty()) return false; for (char c : str.toCharArray()) { if (!Character.isDigit(c)) { return false; } } return true; } ``` - **原理**:使用 `Character.isDigit()` 检查每个字符 - **优点**:不依赖正则,兼容性好[^2] - **性能**:O(n) 时间复杂度 --- #### 3. **ASCII 码值法** ```java public static boolean isOnlyDigits(String str) { if (str == null || str.isEmpty()) return false; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c < '0' || c > '9') { return false; } } return true; } ``` - **原理**:检查字符 ASCII 码是否在 48('0') ~ 57('9') 之间 - **适用场景**:需要极致性能的场景[^1] --- ### 方法对比 | 方法 | 空字符串处理 | 性能 | 可读性 | 推荐度 | |---------------|--------------|----------|--------|--------| | 正则表达式 | ✅ | ⚡️ 快 | ★★★★ | ⭐⭐⭐⭐ | | 字符遍历 | ✅ | ⚡️⚡️ 很快 | ★★★★ | ⭐⭐⭐⭐ | | ASCII 码值 | ✅ | ⚡️⚡️⚡️ 极快 | ★★ | ⭐⭐ | --- ### 关键注意事项 1. **空字符串处理**:所有方法均需显式处理空字符串和 `null` 2. **前导零问题**:`"00123"` 会被视为有效数字 3. **性能优化**:频繁调用时建议预编译正则表达式: ```java private static final Pattern DIGITS_PATTERN = Pattern.compile("\\d+"); public static boolean isOnlyDigits(String str) { return str != null && DIGITS_PATTERN.matcher(str).matches(); } ``` > **重要区别**:这些方法验证的是"是否全为数字",与验证数字格式(如整数/浮点数)不同[^1][^3]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值