java中判断字符串是否为数字的方法的几种方法

本文详细介绍了在Java中判断字符串是否为数字的三种方法:使用JAVA自带函数、正则表达式和Apache Commons Lang库的StringUtils.isNumeric()方法,并提供了相应的代码示例。此外,还解释了如何通过修改正则表达式来验证包含负号的数字。
<span style="font-size:14px;">ava中判断字符串是否为数字的方法:

1.用JAVA自带的函数
</span><pre name="code" class="javascript">public static boolean isNumeric(String str){
  for (int i = 0; i < str.length(); i++){
   System.out.println(str.charAt(i));
   if (!Character.isDigit(str.charAt(i))){
    return false;
   }
  }
  return true;
 }

2.用正则表达式首先要import java.util.regex.Pattern 和 java.util.regex.Matcher
</pre><pre name="code" class="javascript">public boolean isNumeric(String str){ 
   Pattern pattern = Pattern.compile("[0-9]*"); 
   Matcher isNum = pattern.matcher(str);
   if( !isNum.matches() ){
       return false; 
   } 
   return true; 
}


3.使用org.apache.commons.langorg.apache.commons.lang.StringUtils;boolean isNunicodeDigits=StringUtils.isNumeric("aaa123456789");http://jakarta.apache.org/commons/lang/api-release/index.html下面的解释:isNumericpublic static boolean isNumeric(String str)Checks if the String contains only unicode digits. A decimal point is not a unicode digit and returns false.null will return false. An empty String ("") will return true. StringUtils.isNumeric(null) = false StringUtils.isNumeric("") = true StringUtils.isNumeric(" ") = false StringUtils.isNumeric("123") = true StringUtils.isNumeric("12 3") = false StringUtils.isNumeric("ab2c") = false StringUtils.isNumeric("12-3") = false StringUtils.isNumeric("12.3") = false Parameters:str - the String to check, may be null Returns:true if only contains digits, and is non-null 上面三种方式中,第二种方式比较灵活。 第一、三种方式只能校验不含负号“-”的数字,即输入一个负数-199,输出结果将是false; 而第二方式则可以通过修改正则表达式实现校验负数,将正则表达式修改为“^-?[0-9]+”即可,修改为“-?[0-9]+.?[0-9]+”即可匹配所有数字。
http://www.cnblogs.com/moondark/

                
<think> 我们被要求提供5种判断字符串是否数字(包括整数、小数、浮点数)的方法。 根据引用内容,我们可以提取几种不同的方法,包括使用正则表达式、ASCII码、Java自带函数等,并需要涵盖浮点数(即包含小数点的情况)。 注意:用户要求5种方法,我们需要尽可能多地提供不同的实现方式。 方法1:使用正则表达式判断整数或小数(引用[1]和引用[3]) 正则表达式可以匹配整数和小数,例如:`[0-9]*\\.?[0-9]+` 或 `^[0-9]+(.[0-9]+)?$` 等。 方法2:使用正则表达式专门判断浮点数(引用[2]) 引用[2]中给出的正则表达式:`^[-\\+]?[.\\d]*$`,但注意这个表达式可能过于宽松(例如允许单个小数点,或者没有数字只有符号等),我们可以改进。 方法3:使用ASCII码遍历字符串(引用[3]和引用[4]) 遍历每个字符,检查其ASCII码是否数字(0-9)的范围内或者是否为小数点。但是要注意,小数点只能出现一次,且不能在开头或结尾(根据实际情况,有时负数也需要考虑,但这里题目要求不限于小数点、浮点,所以我们可以考虑带符号的情况?但用户要求是“数字”,通常包括正负号?根据引用[1]和[2]有的方法考虑了正负号,有的没有。题目要求包含浮点,所以应该包括正负号和小数点。 方法4:使用Java自带的函数(Character.isDigit)但需要处理小数点和符号(引用[4]方法1的扩展) 引用[4]的方法1只能判断整数,我们可以扩展它,允许一个小数点和正负号。 方法5:使用异常处理(即尝试将字符串转换为数字,捕获异常) 另外,引用[4]中还提供了其他正则表达式,我们可以选择不同的正则表达式作为不同的方法。 注意:用户要求5种方法,我们需要提供5种不同的实现。同时,要确保每种方法都能正确处理包含小数点的浮点数。 根据上述分析,我们设计5种方法方法1:使用正则表达式(匹配整数和浮点数,包括正负号) 方法2:使用正则表达式(另一种正则表达式,可能更精确) 方法3:使用ASCII码遍历(同时检查正负号和小数点,并保证小数点的正确性) 方法4:使用Java自带函数(Character类,同时处理符号和小数点) 方法5:使用Double.parseDouble()并捕获异常(这是一种简单直接的方式) 具体实现: 方法1:正则表达式1(来自引用[1]和[3]的改进) 正则表达式:`^[-+]?[0-9]*\\.?[0-9]+$` 解释: ^: 开始 [-+]?:可选的正号或负号 [0-9]*:0个或多个数字(整数部分可以没有,即.5的情况,但这样的话.5是允许的,但注意单独的小数点不行) \\.?:可选的小数点(0个或1个) [0-9]+:至少一个数字(如果小数点存在,则小数部分至少一个数字;如果整数部分没有,则小数部分必须) $: 结束 但是注意:这个正则表达式允许整数部分为空,如“.5”,但是不允许只有小数点(如“.”)或没有数字(如“+.”)。但是,它不允许科学计数法(如1.2e3)。 方法2:正则表达式2(来自引用[4]的最后一个正则表达式) 正则表达式:`[\\+-]?[0-9]+((.)[0-9])*[0-9]*`,但这个表达式看起来不太对,我们重新设计一个更精确的: 另一种常见法:`^[-+]?\\d+(\\.\\d+)?$` 这个要求整数部分至少有一个数字,小数部分可选,但如果有小数部分,则小数点后至少一个数字。但这样就不能匹配.5这样的形式。为了匹配.5,可以改为:`^[-+]?((\\d+\\.?\\d*)|(\\.\\d+))$` 方法3:使用ASCII码遍历 思路: 1. 首先处理字符串的开头,如果第一个字符是正号或负号,跳过。 2. 遍历剩余字符,遇到小数点时,检查是否已经出现过小数点(只能出现一次)。 3. 其他字符必须是数字(ASCII在48到57之间)。 4. 注意:字符串不能只有符号(如“+”或“-”),也不能以小数点结尾(如“123.”)?但实际中,123.是允许的,因为可以表示123.0?但严格来说,我们要求数字格式,通常要求小数部分有数字。根据需求,我们可以要求如果小数点存在,则后面必须有数字。 5. 另外,字符串不能为空。 方法4:使用Character.isDigit()和检查小数点和符号 类似于方法3,但使用Character.isDigit()来判断数字方法5:使用Double.parseDouble() 直接尝试将字符串转换为double,如果转换成功则是数字,否则捕获异常则不是。 我们分别实现这5种方法,并给出示例。 注意:由于浮点数表示可能包含科学计数法(如1e3),但题目要求的是数字(包含小数点、浮点),通常不包括科学计数法?根据引用内容,之前的讨论都没有包括科学计数法。所以这里我们也不考虑科学计数法,只考虑常规的整数和带小数点的浮点数。 但是,如果用户输入的是科学计数法,那么方法5(Double.parseDouble)是可以接受的,但其他方法可能不行。根据用户要求,我们只处理小数点和整数,所以先不考虑科学计数法。 下面我们编5种方法,并测试一些示例。 注意:我们可能需要对一些边界情况进行测试,例如空字符串、单独符号、多个小数点、符号不在开头等。 我们将为每种方法一个静态方法,然后在main方法中测试。 由于用户要求5种方法,我们分别实现: 方法1:正则表达式1(允许.5和5.这样的形式?5.会被允许吗?根据我们的正则表达式1:`^[-+]?[0-9]*\\.?[0-9]+$`,5.会被允许吗? 分解:5. -> 整数部分5,然后小数点(0个或1个,这里有一个),然后小数部分0个或多个数字?不对,我们要求小数部分至少一个数字(因为[0-9]+)。所以5.不会被匹配,因为最后没有数字。所以我们需要调整。 调整:允许以小数点结尾?但通常我们不希望这样。或者我们可以允许整数部分有数字且以小数点结尾?但这样不是标准的数字字符串。 根据实际需求,有时我们要求小数部分如果有小数点则必须有小数数字?或者允许整数部分有数字,小数部分可以没有(即整数)?或者允许5.0,但是5.不行。 这里我们按照严格的小数表示:如果出现小数点,则小数点前后至少有一个数字(即可以有两种情况:整数部分有数字,小数部分可以没有?不行,我们要求小数部分必须有数字,或者整数部分可以没有,小数部分必须有。所以整体必须至少有一个数字。并且,小数点不能单独存在。 因此,我们调整方法1的正则表达式为(允许:5、5.5、.5;不允许:5.、.、空): `^[-+]?([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$` 这个正则表达式分成三部分: [0-9]+\\.[0-9]* 整数部分至少一个数字,小数点,小数部分0个或多个数字(如5.5, 5.) [0-9]*\\.[0-9]+ 整数部分0个或多个数字,小数点,小数部分至少一个数字(如.5) [0-9]+ 整数(至少一个数字) 注意:这样允许5.(因为第一部分中,小数部分0个或多个,所以5.会被允许)?但用户要求包含小数点,但5.在Java中是可以被Double.parseDouble解析的,所以是否允许看需求。我们这里不允许5.,因为小数部分0个数字,那么第一部分要求整数部分至少一个数字,小数部分0个数字,那么5.就会被允许。如果我们不允许5.,那么需要修改:小数部分至少一个数字,那么第一部分就要改成[0-9]+\\.[0-9]+,这样5.5和5.0可以,但5.不行。但这样就不能匹配整数了,所以整数单独用第三部分匹配。 所以,如果我们希望不允许5.,那么第一部分应该要求小数部分至少一个数字,那么第二部分和第三部分不变。那么5.就不会被匹配(因为它只能匹配第一部分,但第一部分要求小数部分至少一个数字,而5.的小数部分为空,所以不行)。那么5.只能匹配第一部分中的小数部分为空的情况?不,第一部分要求小数部分0个或多个,所以5.会被第一部分匹配(因为第一部分是[0-9]+\\.[0-9]*,5.满足:整数部分5,小数点,小数部分0个数字)。所以如果我们不希望5.,那么需要将第一部分的小数部分改为至少一个数字,即[0-9]+\\.[0-9]+,这样5.5可以,5.不行。 那么5.就不能被匹配,但整数5可以被第三部分匹配。而.5被第二部分匹配(要求小数部分至少一个数字)。如果我们希望5.不被允许,那么可以这样: 所以,我们有两种选择: 选择1:允许5.(即认为5.等同于5.0) -> 那么使用原来的第一部分([0-9]+\\.[0-9]*) 选择2:不允许5.,要求小数部分如果有则至少一个数字 -> 那么第一部分改为[0-9]+\\.[0-9]+,并且增加第四部分:[0-9]+\\.(这样单独5.就不能匹配了?不行,因为这样5.还是匹配不到,所以5.就是不允许的。 但是,用户要求包含小数点,所以5.应该被允许吗?这取决于需求。在严格数学表示中,5.表示5,但是多了一个小数点,通常我们要求小数部分如果有就必须有数字。所以这里我们按照不允许5.,即小数点后必须有数字。 调整后的正则表达式(不允许5.): `^[-+]?([0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|[0-9]+)$` 但是注意,第二部分[0-9]*\\.[0-9]+可以匹配.5,也可以匹配5.5(因为整数部分5,小数部分5,然后中间小数点)?不对,因为第一部分已经匹配了整数部分有数字且小数部分有数字的情况(即5.5),所以第二部分匹配的是整数部分没有数字的情况(如.5)。所以5.5会被第一部分匹配,而不会被第二部分匹配(因为第二部分要求整数部分0个或多个,但是第二部分的小数点前没有要求,所以5.5会被第一部分匹配(更精确匹配)?这里正则表达式是或的关系,所以按顺序,第一部分匹配了5.5,就不会再去匹配第二部分。 因此,我们这样: 第一部分:整数部分至少一个数字,小数部分至少一个数字(如5.5) 第二部分:整数部分没有数字(或者有数字也可以?但是有数字的情况已经被第一部分匹配了,所以实际上第二部分只匹配整数部分为空的情况)且小数部分至少一个数字(如.5) 第三部分:整数(至少一个数字,如5) 但是这样不能匹配5.0(因为第一部分要求整数部分有数字,小数部分有数字,5.0满足)?可以。但是5.(5后面只有小数点)没有匹配,因为第一部分要求小数部分至少一个数字,而第二部分要求整数部分可以没有数字,但必须有小数部分且至少一个数字,第三部分要求整数。所以5.没有匹配。 所以这个正则表达式不允许5.,但允许5.0。 但是,如果用户输入的是5.,那么我们希望它不被认为是数字?还是希望认为是数字?根据需求,我们可以灵活调整。 为了简单起见,我们参考Double.parseDouble()的规则:它允许5.,并将其解析为5.0。所以如果我们要和方法5保持一致,那么应该允许5.。 因此,我们修改为允许5.: `^[-+]?([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$` 这个表达式允许5.,因为它匹配第一部分:整数部分5,小数点,小数部分0个数字(允许0个)。 但是注意,这个表达式也允许单独的小数点(.)吗?第二部分要求小数部分至少一个数字,所以.不会匹配(因为小数部分没有数字)。第一部分要求整数部分至少一个数字,所以.也不匹配。第三部分要求整数,所以.不匹配。所以单独的小数点不会匹配。 所以这个正则表达式满足要求。 但是,这个正则表达式会匹配空字符串吗?不会,因为三个分支都要求至少有一个数字(第一部分整数部分有数字或者小数部分有数字,第二部分小数部分有数字,第三部分整数有数字)。 因此,方法1使用这个正则表达式。 方法2:我们可以使用另一种正则表达式,比如引用[4]中最后一个:`[\\+-]?[0-9]+((.)[0-9])*[0-9]*`,但这个表达式有误,因为它要求整数部分至少一个数字,然后后面是0个或多个(一个点加上数字)的重复,然后后面还可以有0个或多个数字。这实际上允许了多个小数点(因为((.)[0-9])*可以重复多次,每次重复可以有一个点)。所以不行。 我们改为一个更简单的:`^[-+]?\\d*\\.?\\d+$`,这个和之前方法1的第一个正则表达式类似,允许整数部分为空,小数部分必须有一个数字。它允许.5,允许5.5,允许5.,因为\\d*\\.?\\d+中,\\d*可以没有,\\.?可以没有或者有一个,\\d+至少一个数字。所以5.5:整数部分5,小数点,小数部分5 -> 匹配;5.:整数部分5,小数点,小数部分没有?不行,因为\\d+要求至少一个数字,所以5.不能匹配。所以这个正则表达式不允许5.。 因此,我们换一个:`^[-+]?(\\d+(\\.\\d*)?|\\.\\d+)$`,这个表达式: 第一部分:\\d+(\\.\\d*)? 表示至少一个数字,后面可以跟一个小数点和0个或多个数字(允许5.5, 5., 5) 第二部分:\\.\\d+ 表示小数点后至少一个数字(.5) 所以这个表达式允许5.,也允许.5,允许5.5,允许5。 所以方法2使用这个正则表达式:`^[-+]?(\\d+(\\.\\d*)?|\\.\\d+)$` 方法3:使用ASCII码遍历 步骤: 1. 如果字符串为空,返回false。 2. 检查第一个字符是否是正负号,如果是,则从下一个字符开始,否则从第一个字符开始。 3. 设置一个标志hasDot表示是否已经遇到小数点。 4. 遍历每个字符: - 如果字符是小数点: 如果已经遇到过小数点,返回false; 否则设置hasDot为true。 - 否则,如果字符不是数字(ASCII不在48~57之间),返回false。 5. 但是,如果字符串只有一个字符,且这个字符是正负号,那么返回false(因为只有一个符号)。 6. 另外,我们不允许单独的小数点(即字符串为"."),但允许".5"或"5."?但是注意,如果字符串是".",那么我们在遍历时,第一个字符是小数点,然后hasDot设为true,然后结束。此时,我们需要检查是否至少有一个数字?因为我们遍历过程中没有要求必须有数字。所以我们需要在最后检查:整个字符串不能只有符号和小数点而没有数字,即至少有一个数字。 因此,我们在遍历中记录是否遇到了数字(用一个hasDigit变量)。如果最后没有数字,返回false。 所以算法: boolean hasDot = false; boolean hasDigit = false; int start = 0; if (str.isEmpty()) return false; char first = str.charAt(0); if (first == '+' || first == '-') { start = 1; } // 如果字符串只有一个字符且是符号,那么后面没有数字,所以如果长度是1,且第一个是符号,则无效 if (start == 1 && str.length() == 1) { return false; } for (int i = start; i < str.length(); i++) { char c = str.charAt(i); if (c == '.') { if (hasDot) { return false; } hasDot = true; } else if (c >= '0' && c <= '9') { hasDigit = true; } else { return false; } } return hasDigit; // 必须至少有一个数字 注意:这个算法允许5.,因为5.5.不允许(多个小数点),5.是允许的(hasDigit在遇到5时已经为true),并且最后返回true。 方法4:使用Character.isDigit(),基本同方法3,只是判断数字的方式不同: else if (Character.isDigit(c)) { ... } 方法5:使用Double.parseDouble() try { Double.parseDouble(str); return true; } catch (NumberFormatException e) { return false; } 但是注意,Double.parseDouble()支持科学计数法,也允许5.和.5,但是也支持其他格式(如十六进制?不,它只能解析十进制,包括科学计数法)。所以如果用户输入科学计数法(如1e2),也会返回true。但题目要求是数字(包含小数点、浮点),所以科学计数法是否被接受?题目没有明确,但通常我们只考虑十进制的小数。所以如果用户输入科学计数法,方法5会返回true,而其他方法可能返回false(因为其他方法没有考虑e)。所以方法5和其他方法在科学计数法上有差异。 由于题目要求5种方法,并且没有提到科学计数法,我们按照常规理解(不包含科学计数法)来比较。所以方法5可能会比前四种方法多支持科学计数法,但这不是我们关注的重点。我们主要关注小数点和整数。 现在,我们编5种方法,并给出示例代码。 注意:在方法3和方法4中,我们对5.是允许的,因为遍历时,5是数字,记录hasDigit=true,然后遇到小数点,继续,最后返回hasDigit为true。所以5.被允许。 下面我们编代码: </think>以下是5种Java判断字符串是否数字(包括整数、小数、浮点数)的实现方法,涵盖正则表达式、ASCII码验证、异常处理等方式: ### 方法1:正则表达式(整数+浮点数) ```java public static boolean isNumber1(String str) { // 匹配:符号(可选) + 整数部分 + 小数点(可选) + 小数部分 return str.matches("^[-+]?\\d+(\\.\\d*)?$"); } ``` **说明**: - `^[-+]?`:可选正负号 - `\\d+`:至少1位整数 - `(\\.\\d*)?`:可选的小数部分(如 `.5`、`.123`) - 支持 `-123`、`3.14`、`+0.5`,不支持 `.`(单独小数点)或空字符串[^1][^4] --- ### 方法2:精确浮点数正则 ```java public static boolean isNumber2(String str) { // 严格匹配:符号(可选) + (整数.小数 或 纯小数) return str.matches("^[-+]?(\\d+\\.\\d+|\\d*\\.\\d+)$"); } ``` **说明**: - 要求小数点**前后至少包含一个数字** - 支持 `0.5`、`.75`、`123.456` - 拒绝 `123.`(末尾无小数)、`.`(单独小数点)[^1][^3] --- ### 方法3:ASCII码遍历验证 ```java public static boolean isNumber3(String str) { if (str == null || str.isEmpty()) return false; int start = (str.charAt(0) == '-' || str.charAt(0) == '+') ? 1 : 0; boolean hasDigit = false; // 是否数字 boolean hasDot = false; // 是否有小数点 for (int i = start; i < str.length(); i++) { char c = str.charAt(i); if (c == '.') { if (hasDot) return false; // 重复小数点 hasDot = true; } else if (c >= '0' && c <= '9') { hasDigit = true; // 找到数字 } else { return false; // 非法字符 } } return hasDigit; // 至少包含一个数字 } ``` **说明**: - 手动检查每个字符的ASCII值(`0`-`9`为48-57) - 允许 `5.`(末尾小数点)和 `.5`(开头小数点) - 性能较高,无正则开销[^3][^4] --- ### 方法4:Java内置函数+小数点处理 ```java public static boolean isNumber4(String str) { if (str == null || str.isEmpty()) return false; int start = (str.charAt(0) == '-' || str.charAt(0) == '+') ? 1 : 0; boolean hasDigit = false; boolean hasDot = false; for (int i = start; i < str.length(); i++) { char c = str.charAt(i); if (c == '.') { if (hasDot) return false; hasDot = true; } else if (Character.isDigit(c)) { hasDigit = true; // 使用Java内置函数 } else { return false; } } return hasDigit; } ``` **说明**: - 使用 `Character.isDigit()` 替代ASCII码判断 - 逻辑同方法3,但更易读 - 支持科学计数法需额外处理 `e/E`[^4] --- ### 方法5:异常捕获法(try-catch) ```java public static boolean isNumber5(String str) { try { Double.parseDouble(str); // 尝试转换 return true; } catch (NumberFormatException e) { return false; } } ``` **说明**: - 最简单直接的实现 - 支持科学计数法(如 `1.23e4`) - **缺点**:异常捕获性能开销大,不推荐高频调用[^2] --- ### 测试用例 ```java public static void main(String[] args) { String[] tests = {"123", "-3.14", ".5", "5.", "abc", "1.2.3", "+0.0"}; for (String test : tests) { System.out.println(test + " : " + isNumber1(test)); // 替换方法名测试其他方法 } } ``` **输出示例**: ``` 123 : true -3.14 : true .5 : true 5. : true // 方法1/3/4/5支持,方法2拒绝 abc : false 1.2.3 : false +0.0 : true ``` ### 选择建议 1. **需要高性能** → 方法3(ASCII遍历) 2. **代码简洁** → 方法1(正则) 3. **严格小数验证** → 方法2(精确正则) 4. **兼容科学计数法** → 方法5(异常捕获) [^1]: 正则表达式实现数字检测(整数/小数) [^2]: 异常捕获法转换浮点数 [^3]: ASCII码遍历验证数字格式 [^4]: 组合使用`Character.isDigit()`和小数点处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值