2013-03-22 58 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

相關問題