我有一个基元的String表示,我的目标是确定它是哪个原语
我的功能如下:
public Object getPrimitive(String primitiveAsString) {
.....
}
因此,例如,我希望在输入为“223”的情况下返回一个整数,但如果输入为“223.1”或甚至是“223.0”(!!)则返回double。此外,我想将float和double分开,甚至在整数和“BigInteger”之间分开。
我尝试过使用NumberFormat的解决方案,它对我不起作用。
是否有一种优雅的方式呢?
谢谢!
答案 0 :(得分:0)
一个想法就是尝试在try-catch中返回每种类型。
代码:(错误检查可能不太理想)
public static void main(String[] args)
{
System.out.println(getPrimitive("123")); // Byte
System.out.println(getPrimitive("1233")); // Short
System.out.println(getPrimitive("1233587")); // Integer
System.out.println(getPrimitive("123.2")); // Float
System.out.println(getPrimitive("123.999999")); // Double
System.out.println(getPrimitive("12399999999999999999999999")); // BigInteger
System.out.println(getPrimitive("123.999999999999999999999999")); // BigDecimal
}
static public Object getPrimitive(String string)
{
try { return Byte.valueOf(string); } catch (Exception e) { };
try { return Short.valueOf(string); } catch (Exception e) { };
try { return Integer.valueOf(string); } catch (Exception e) { };
try { return new BigInteger(string); } catch (Exception e) { };
try { if (string.matches(".{1,8}"))
return Float.valueOf(string); } catch (Exception e) { };
try { if (string.matches(".{1,17}"))
return Double.valueOf(string); } catch (Exception e) { };
try { return new BigDecimal(string); } catch (Exception e) { };
// more stuff ?
return null;
}
.{1,8}
和.{1,17}
背后的原因是float
和double
精确到每个约7和16位数(根据一些随机来源)。 .
是一张外卡。 {x,y}
表示在x和y之间重复。
修改强>
改进以区分float
,double
和BigDecimal
与基本正则表达式等。
答案 1 :(得分:0)
我怀疑你能否轻松地做到这一点。检测String的内容是属于整数还是BigInteger将是非常棘手或几乎不可能的。您当然可以通过编写正则表达式来区分int和double / float,以确定它是否包含'。,其余字符是数字。
答案 2 :(得分:0)
我会做这样的事情......这应该适用于BigInteger和BigDecimal ......虽然没有测试过。
public Object getPrimitive(String primitiveAsString) {
String value = primitiveAsString;
try {
return Byte.valueOf(value);
} catch (NumberFormatException ex) { }
try {
return Short.valueOf(value);
} catch (NumberFormatException ex) { }
try {
return Integer.valueOf(value);
} catch (NumberFormatException ex) { }
try {
return Float.valueOf(value);
} catch (NumberFormatException ex) { }
try {
return Double.valueOf(value);
} catch (NumberFormatException ex) { }
try {
return Long.valueOf(value);
} catch (NumberFormatException ex) { }
try {
return new BigInteger(value);
} catch (NumberFormatException ex) { }
try {
return new BigDecimal(value);
} catch (NumberFormatException ex) { }
if(value.length() == 1) {
return new Character(value.charAt(0));
}
return null;
}
编辑:改进了解决方案,以满足输入为BigInteger / BigDecimal时的情况。此解决方案不使用任何正则表达式。