如何确定String表示中的基元类型?

时间:2013-03-22 11:55:21

标签: java primitive number-formatting


我有一个基元的String表示,我的目标是确定它是哪个原语 我的功能如下:

public Object getPrimitive(String primitiveAsString) {
.....
}

因此,例如,我希望在输入为“223”的情况下返回一个整数,但如果输入为“223.1”或甚至是“223.0”(!!)则返回double。此外,我想将float和double分开,甚至在整数和“BigInteger”之间分开。

我尝试过使用NumberFormat的解决方案,它对我不起作用。

是否有一种优雅的方式呢?

谢谢!

3 个答案:

答案 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}背后的原因是floatdouble精确到每个约7和16位数(根据一些随机来源)。 .是一张外卡。 {x,y}表示在x和y之间重复。

修改

改进以区分floatdoubleBigDecimal与基本正则表达式等。

答案 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时的情况。此解决方案不使用任何正则表达式。