一起验证int和float值

时间:2013-05-06 08:01:08

标签: java

我通过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;
}

现在问题是来自amount的{​​{1}}是一个整数,例如h,但它也可以是1234之类的浮点数。因此,在float的情况下,它会抛出1258.26

如果值是整数还是浮点值,我怎样才能使它完美?

5 个答案:

答案 0 :(得分: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]+)?";

答案 1 :(得分: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)

但是,此解决方案不会验证值的范围。字符串10000000000仍会被识别为VarType.INTEGER,即使该值无法适合Java中的int变量。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

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

否则,您所说的是 double 浮点值。

new BigDecimal( str)将为您解析整数或小数,但它也会接受指数;例如,1.4E2表示140。

也许您想先使用正则表达式模式进行验证;

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

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

答案 4 :(得分:0)

根据建议,最好使用longdouble代替intfloat

顺便说一下,你不能简单地检查float吗?如果是int,则始终为floatpotentially 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