我通过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
。
如果值是整数还是浮点值,我怎样才能使它完美?
答案 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)
根据建议,最好使用long
和double
代替int
和float
。
顺便说一下,你不能简单地检查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