Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定字符串表示中的基元类型?_Java_Primitive_Number Formatting - Fatal编程技术网

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。@Ankur
123999999999999999999
大于
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;
}