首先,如果你有一个名为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
。
怎么来的系统可以给你非int值,如果你没有允许非整型数字? – 2013-05-06 08:03:08
你的getter应该指定它返回一个int或float吗?你怎么把它作为一个String来处理呢? – Aquillo 2013-05-06 08:05:11
这是字符串的内容*应该是一个序列化的整数值,但*可能是一个小数。 – 2013-05-06 08:07:10