2013-03-22 67 views
3


我有一个原语的字符串表示,我的目标是确定它是哪个原语。
我的功能如下:
如何确定字符串表示中的图元类型?

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

因此,举例来说,我想如果返回一个整数输入的是“223”,但双,如果输入的是“223.1”,甚至“223.0”( !!)。此外,我想分开浮动和双之间,甚至整数和“BigInteger”之间。

我试过使用NumberFormat的解决方案,它不适用于我......

有没有一种优雅的方式来做到这一点?

谢谢!

+3

不,没有优雅的方式。 – 2013-03-22 11:56:52

+2

你需要支持哪些基本类型? – NPE 2013-03-22 11:58:01

+0

用什么方法可以区分整数的字符串表示与BigInteger的表示(只要该值介于MAX_INT和MIN_INT之间)? – Erik 2013-03-22 12:03:11

回答

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次之间重复。

编辑:

改进分化floatdoubleBigDecimal与除其他事项外一个基本的正则表达式。

+0

如何确定属于BigInteger/BigDecimal的数字,因为Integer.parseInt()本身将正确解析为整数。 – 2013-03-22 12:12:57

+0

@Ankur'12399999999999999999999999'比适合'Integer'的大,所以它会进入'BigInteger'。 – Dukeling 2013-03-22 12:13:44

+0

如果数字很小,该怎么办?它仍然可以属于BigInteger – 2013-03-22 12:14:41

0

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

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; 
} 

EDIT:提高该溶液,以应付情况下,当输入的是一个BigInteger/BigDecimal的。此解决方案不使用任何正则表达式。

+1

你的订单是错误的,'Byte'和'Short'永远不会触发(因为所有的'Byte'和'Short's也是'Integer's。'Float'也不会被'Double'覆盖) – Dukeling 2013-03-22 12:17:36

+0

公平点,谢谢你的指针,做了修改 – vijay 2013-03-22 12:19:58

+0

试着找到任何测试用例,它会返回'Double'或者''BigDecimal'','Float'可能会覆盖所有的东西(即使它很大),这就是为什么你需要正则表达式。 – Dukeling 2013-03-22 13:02:24

相关问题