3


我有一个原语的字符串表示,我的目标是确定它是哪个原语。
我的功能如下:

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

因此,例如,如果输入是“223”,我想返回一个整数,但如果输入是“223.1”甚至是“223.0”(!!),则返回一个双精度数。此外,我想区分浮点数和双精度数,甚至整数和“BigInteger”。

我尝试了一个使用 NumberFormat 的解决方案,但它对我不起作用......

有没有一种优雅的方法可以做到这一点?

谢谢!

4

3 回答 3

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}and背后的原因.{1,17}floatanddouble分别精确到大约 7 位和 16 位数字(根据一些随机来源)。.是通配符。{x,y}表示在 x 和 y 次之间重复。

编辑:

改进以区分floatdoubleBigDecimal使用基本的正则表达式等。

于 2013-03-22T12:07:57.840 回答
0

我怀疑你可以很容易地做到这一点。要检测 String 的内容是属于 integer 还是 BigInteger 将非常棘手或几乎不可能。您当然可以通过编写正则表达式来确定它是否包含“。”来区分 int 和 double/float 。其余字符是数字。

于 2013-03-22T12:11:20.123 回答
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 的情况。此解决方案不使用任何正则表达式。

于 2013-03-22T12:15:59.680 回答