【转】Java判断是否是整数,小数或实数的正则表达式

经常会遇到这样的情况,需要判断一个字符串是否是一个合法的数,包括整数,小数或者实数。

    网上查到很多文章大多是判断这个字符串是否全为数字,比如下面这段来自StringUtils的代码,可以看到,13.2这样的数字实际上会返回false,可是,他的确是一个数字。

 

[java]  view plain copy
 
 
 
  1. public static boolean isNumeric(String str) {  
  2.         if (str == null) {  
  3.             return false;  
  4.         }  
  5.         int sz = str.length();  
  6.         for (int i = 0; i < sz; i++) {  
  7.             if (Character.isDigit(str.charAt(i)) == false) {  
  8.                 return false;  
  9.             }  
  10.         }  
  11.         return true;  
  12.     }  

   当然,网上还能查到很多其他方式,诸如用正则表达式判断是否0-9,用字符ascii码判断是否是数字以及用Double.parseDouble()是否抛出异常来判断是否为数字。

 

   事实上,除了最后一种方式能达到我们的要求,其他的都很难真正做到类似的判断。但是最后一种方式也很难区别出到底是正整数,负整数,正小数还是负小数,而且,捕获异常的方式实在是有些难看。

   基于此原因,我自己写了一个工具类,专门用作数的检测,目前能够检测正整数,负整数,整数,正小数,负小数,小数以及实数,采用的仍然是正则表达式的方式,当然,如果有遗漏或者错误,欢迎联系我以便更正,同时也欢迎修改或使用这些代码以便符合你的应用场景。

   可以简单讲下正则的思想以便修改,

   1. 对于正整数而言,可以带+号,第一个数字不能为0

   2. 对于负整数而言,必须带负号,第一个数字也不能为0

   3. 对于整数而言,实际是由0,正整数和负整数组成的,所以偷个懒用前两个方法一起判断

   4. 对于正小数而言,可以考带+号,并考虑两种情况,第一个数字为0和第一个数字不为0,第一个数字为0时,则小数点后面应该不为0,第一个数字不为0时,小数点后可以为任意数字

   5. 对于负小数而言,必须带负号,其余都同上

   6. 对于小数,可以带正负号,并且带小数点就行了,但是至少保证小数点有一边不为空,所以这里还是分左边不为空和右边不为空的情况

   7. 实数比较简单,,要么是整数,要么是小数

 

[java]  view plain copy
 
 
 
  1. package com.sap.cesp.creditinsight.web.app.util;  
  2.   
  3. import java.util.regex.Matcher;  
  4. import java.util.regex.Pattern;  
  5.   
  6. public class NumberValidationUtils {  
  7.       
  8.     private static boolean isMatch(String regex, String orginal){  
  9.         if (orginal == null || orginal.trim().equals("")) {  
  10.             return false;  
  11.         }  
  12.         Pattern pattern = Pattern.compile(regex);  
  13.         Matcher isNum = pattern.matcher(orginal);  
  14.         return isNum.matches();  
  15.     }  
  16.   
  17.     public static boolean isPositiveInteger(String orginal) {  
  18.         return isMatch("^\\+{0,1}[1-9]\\d*", orginal);  
  19.     }  
  20.   
  21.     public static boolean isNegativeInteger(String orginal) {  
  22.         return isMatch("^-[1-9]\\d*", orginal);  
  23.     }  
  24.   
  25.     public static boolean isWholeNumber(String orginal) {  
  26.         return isMatch("[+-]{0,1}0", orginal) || isPositiveInteger(orginal) || isNegativeInteger(orginal);  
  27.     }  
  28.       
  29.     public static boolean isPositiveDecimal(String orginal){  
  30.         return isMatch("\\+{0,1}[0]\\.[1-9]*|\\+{0,1}[1-9]\\d*\\.\\d*", orginal);  
  31.     }  
  32.       
  33.     public static boolean isNegativeDecimal(String orginal){  
  34.         return isMatch("^-[0]\\.[1-9]*|^-[1-9]\\d*\\.\\d*", orginal);  
  35.     }  
  36.       
  37.     public static boolean isDecimal(String orginal){  
  38.         return isMatch("[-+]{0,1}\\d+\\.\\d*|[-+]{0,1}\\d*\\.\\d+", orginal);  
  39.     }  
  40.       
  41.     public static boolean isRealNumber(String orginal){  
  42.         return isWholeNumber(orginal) || isDecimal(orginal);  
  43.     }  
  44.   
  45. }  

猜你喜欢

转载自bigdragon.iteye.com/blog/2215995