Java 如何确定字符串表示中的基元类型?
Java 如何确定字符串表示中的基元类型?,java,primitive,number-formatting,Java,Primitive,Number Formatting,我有一个原语的字符串表示,我的目标是确定它是哪个原语。 我的功能如下: public Object getPrimitive(String primitiveAsString) { ..... } 例如,我想在输入为“223”的情况下返回一个整数,但如果输入为“223.1”甚至“223.0”,则返回一个双精度(!!)。此外,我想在float和double之间,甚至在integer和biginger之间进行分隔。 我尝试了一个使用NumberFormat的解决方案,但它对我无效…… 有一种优雅的
我有一个原语的字符串表示,我的目标是确定它是哪个原语。
我的功能如下:
public Object getPrimitive(String primitiveAsString) {
.....
}
例如,我想在输入为“223”的情况下返回一个整数,但如果输入为“223.1”甚至“223.0”,则返回一个双精度(!!)。此外,我想在float和double之间,甚至在integer和biginger之间进行分隔。我尝试了一个使用NumberFormat的解决方案,但它对我无效……
有一种优雅的方式吗?
谢谢 一个想法就是尝试返回try catch中的每个类型 代码:(错误检查可能不理想)
{1,8}
和{1,17}
背后的原因是float
和double
分别精确到大约7位和16位(根据一些随机源)<代码>是通配符{x,y}
表示在x和y次之间重复
编辑:
改进了以基本正则表达式区分
float
、double
和bigdecimic
。我怀疑你能很容易做到这一点。要检测字符串的内容是属于integer还是BigInteger将非常棘手,甚至几乎不可能。当然,您可以通过编写正则表达式来区分int和double/float,以确定它是否包含。,其余字符是数字 我会这样做。。。这应该适用于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的情况。此解决方案不使用任何正则表达式。不,没有优雅的方法。您需要支持哪些基元类型?以何种方式区分整数的字符串表示形式与BigInteger的表示形式(只要值介于MAX_INT和MIN_INT之间)?BigInteger不是基元。另外,让方法返回
对象
,而该方法的名称是getPrimitive
,其原因(对于提出请求的人)是初始化一个映射,该映射稍后将由Gson.toJson(myMap)解析结果将被发送到客户端。您将如何确定属于biginger/bigdecime的数字,作为Integer。parseInt()本身将正确地将其解析为Integer。@Ankur123999999999999999999
大于Integer
中的数值,因此它将变成biginger
。如果这个数字很小怎么办?它仍然可以属于BigInteger@Ankur我猜想OP正在寻找一种贪婪的方法——如果它是int
,则返回该方法;如果它是biginger
,则返回该方法;如果它是float
,则返回该方法,等等。您的顺序错误,Byte
和Short
将永远不会触发(因为所有Byte
s和Short
s也都是Integer
s。也不会Float
(由Double
覆盖)。试着找到任何返回Double
或bigdecimic
的测试用例,它们可能会覆盖所有内容(即使它的轮数很大).这就是你需要正则表达式的原因。
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;
}