3

amount通过它的 getter 获取一个对象中命名的值,如下所示。

假设对象h

h.getAmount()

现在我需要开发一个验证器来验证它amount应该是整数类型,如果不是那么它将抛出异常,我已经开发了它,如下所示

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

现在的问题是amountfromh是一个整数,例如1234,但它也可以是一个浮点数,例如1258.26. 所以在浮动的情况下,它会抛出一个NumberFormatException.

无论是整数还是浮点数,我怎样才能使它对这两个值都完美?

4

5 回答 5

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]+)?";
于 2013-05-06T08:11:12.947 回答
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;
     }
}

不过我不推荐它,因为以这种方式使用异常确实很昂贵。Exceptions 应该顾名思义,用来处理特殊情况、异常,而不是作为标准流程。

我会这样做:

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));
        }
    }

}

这么简单的任务要花很长时间,但是:

  • 没有正则表达式

  • 最多对字符串进行一次扫描

  • 可读(海事组织)

  • 快速地

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

于 2013-05-06T08:27:15.317 回答
1

使用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;
}
于 2013-05-06T09:08:13.317 回答
1

正如建议的那样,最好使用longanddouble而不是intand float

顺便说一句,你不能简单地检查一下float吗?如果它是 a int,那么它总是可以是 a float可能会因精度损失而四舍五入

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
于 2013-05-06T10:46:41.430 回答
0

如果您谈论的是整数或几位小数,那么您可能谈论的是金钱数量BigDecimal 是理想的选择; 并且浮点并不是那么好(由于舍入错误)。

否则,您说的是浮点值。

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

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

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

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

于 2013-05-06T09:32:34.277 回答