2013-05-06 28 views
1

我通过它的getter在对象中获取一个名为amount的值,如下所示。验证整数和浮点数值在一起

假设对象是h然后

h.getAmount() 

现在我需要建立一个验证,将验证amount应该是整型的,如果不是,那么它会抛出异常,我已经开发也如下所示

private boolean isint (String amount){ 
    boolean isValid = true; 
    try { 
     Integer.parseInt(amount); 
    } 
    catch(NumberFormatException e){ 
     isValid = false; 
    } 
    return isValid; 
} 

现在的问题是,从amounth作为1234这样的整数,但它也可以是一个浮子如1258.26。所以在浮动的情况下抛出一个NumberFormatException

无论是整数还是浮点值,我怎样才能使它完美呢?

+0

怎么来的系统可以给你非int值,如果你没有允许非整型数字? – 2013-05-06 08:03:08

+0

你的getter应该指定它返回一个int或float吗?你怎么把它作为一个String来处理呢? – Aquillo 2013-05-06 08:05:11

+0

这是字符串的内容*应该是一个序列化的整数值,但*可能是一个小数。 – 2013-05-06 08:07:10

回答

3

你可以使用一个regex这样的: -

if (str.matches("[-+]?[0-9]*\\.?[0-9]+")) { // You can use the `\\d` instead of `0-9` too! 
    // Is a number - int, float, double   
} 

[ - +]? - 对于标志。

[0-9] * \。?[0-9] + - 数字和它们之间的小数点。

更新: -

如果指数需要被处理过,那么下面regex可以使用。所有的

String regex = "[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?"; 
+0

@Dukeling - 答案更新!案件处理!:) – SudoRahul 2013-05-06 08:26:10

+0

我会考虑'1.6e6'一个浮动或双。 – 2013-05-06 09:13:08

3

首先,如果你有一个名为isInt功能,它应该做的正是 - 检查它是否是一个整数。不多也不少。

你可以尝试这样的事情

enum VarType { 
    INTEGER, FLOAT, STRING, EMPTY 
} 

private VarType getVarType(String amount){ 
    if (amount.length() ==0) { 
     return VarType.EMPTY; 
    } 
    if (amount.contains(".")) { 
     try { 
     Float.parseFloat(amount); 
     } 
     catch(NumberFormatException e){ 
     return ValType.STRING; 
     } 
     return ValType.FLOAT; 
    } else { 
     try { 
     Integer.parseInt(amount); 
     } 
     catch(NumberFormatException e){ 
     return ValType.STRING; 
     } 
     return ValType.INTEGER; 
    } 
} 

我不会推荐它,但因为以这种方式使用的例外是真的很贵。例外应该像顾名思义一样使用,以处理特殊情况,例外情况,而不是标准流程。

我会做这样的:

public class ParseVarTest { 

    static enum VarType { 
     INTEGER, FLOAT, STRING, EMPTY 
    } 

    private static VarType getVarType(String amount){ 
     boolean onlyDigits = true; 
     int dotCount = 0; 
     if (amount == null) { 
      return VarType.EMPTY; 
     } 
     String trimmed = amount.trim(); 
     if (trimmed.length() == 0) { 
      return VarType.EMPTY; 
     } 
     int a=0; 
     if (trimmed.charAt(0) == '-') { 
      a++; 
     } 
     for (int max=trimmed.length(); a<max; a++) { 
      if (trimmed.charAt(a) == '.') { 
       dotCount++; 
       if (dotCount>1) break; 
      } else if (!Character.isDigit(trimmed.charAt(a))) { 
       onlyDigits = false; 
       break; 
      } 
     } 

     if (onlyDigits) { 
      if (dotCount ==0) { 
       return VarType.INTEGER; 
      } else if (dotCount ==1) { 
       return VarType.FLOAT; 
      } else { 
       return VarType.STRING; 
      } 
     } 
     return VarType.STRING; 
    } 

    public static void main(String[] args) { 
     String[] vars = {"", " ", "123", "-5123", "1234.41", "-1234.41", "-1234..41","a12312", "523sdf234sdf.123"}; 
     for (String var: vars) { 
      System.out.print(var); 
      System.out.print(": \t"); 
      System.out.println(getVarType(var)); 
     } 
    } 

} 

这是相当长的这样一个简单的任务,但:

  • 没有正则表达式

  • 最多的单次扫描的字符串

  • 可读的(IMO)

  • 快速

然而,这溶液不验证值的范围内。即使该值不适合Java中的int变量,字符串10000000000仍将被识别为VarType.INTEGER

+0

你可以有一个数字,它是一个有效的'float',它不包含'.',但不是一个有效的'int'值。例如'10000000000' – 2013-05-06 09:08:02

+1

@PeterLawrey是的,这里没有考虑数值范围。谢谢你的评论。在这种情况下,使用例外的解决方案会更好。 – Dariusz 2013-05-06 09:10:27

0

使用Double.parseDouble ...(方法名称变更为isNumber,以更好地反映该方法的意思)......

private boolean isNumber (String amount){ 
    boolean isValid = true; 
    try { 
     Double.parseDouble(amount); 
    } 
    catch(NumberFormatException e){ 
     isValid = false; 
    } 
    return isValid; 
} 

...并可以简化为...

private boolean isNumber (String amount){ 
    try { 
     Double.parseDouble(amount);    
    } 
    catch(NumberFormatException e){ 
     return false;    
    } 
    return true; 
} 
+0

我建议OP使用'double',但是如果OP只使用'int'或'float',那么这个方法可以返回true,对于不适合的值。 – 2013-05-06 09:10:27

+0

@PeterLawrey同意。我的回答假设OP想要允许一个数值范围。从Double.MIN_VALUE到Double.MAX_VALUE。如果OP想限制为浮点大小的数字,请使用parseFloat等。 – xagyg 2013-05-06 09:12:07

+0

这些值都不适合float或int。 – 2013-05-06 09:13:56

0

如果你在谈论的整数或几个小数,你可能是在谈论,为此BigDecimal很理想;和浮点不太好(由于舍入错误)。

否则,你说的是double浮点值。

new BigDecimal(str)会为您解析一个整数或小数,但它也会接受指数;例如1.4E2意味着140.

也许你想使用正则表达式模式来验证它;

if (! str.matches("[-+]?(\\d+)|(\\d*\\.\\d+)")) 
    throw new NumberFormatException(); 

此模式接受不带任何前导数字的小数,例如.14159 - 这应该是允许的。

0

如上所述,最好使用longdouble而不是intfloat

顺便说一句,你不能简单地检查一个float?如果它是int,那么它总是可以是float,potentially rounded with loss of precision

public static boolean isFloat(String number){ 
    try { 
     return !new Float(number).isNaN(); 
    } catch (NumberFormatException e){ 
     return false; 
    } 
} 

运行演示:https://ideone.com/UpGPsK

输出:

> 1234     IS  a valid Integer or Float  
> 1234.56    IS  a valid Integer or Float  
> 1234.56.78   IS NOT a valid Integer or Float  
> abc     IS NOT a valid Integer or Float  
> 2147483647   IS  a valid Integer or Float  
> 3.4028235E38   IS  a valid Integer or Float  
> -2147483648   IS  a valid Integer or Float  
> 1.4E-45    IS  a valid Integer or Float