2016-10-04 78 views
1

在我的Java代碼中,我有四個文本格式的數字(String): Es。將String轉換爲大十進制的一般方法

String s1 = "1234.56"; 
String s2 = "1235,56"; 
String s3 = "1,234.56"; 
String s4 = "1.234,56"; 

我想將這些字符串轉換爲BigDecimal的:

BigDecimal b1 = new BigDecimal(s1); 
... 
... 

顯然,這是行不通的,因爲BigDecimal的不接受所有格式(用逗號字符串)。 有一種通用的方法可以讓我轉換BigDecimal中的所有字符串?

回答

0

DecimalFormat怎麼辦? Doc here

你只需要解析字符串之前定義的小數點分隔符的圖案......

DecimalFormat decimalFormat = new DecimalFormat("#,###.##"); 
decimalFormat.setParseBigDecimal(true); 
BigDecimal bigDecimal = (BigDecimal) decimalFormat.parse("1,234.56"); 
System.out.println(bigDecimal); 

應該做的伎倆

+0

好的,但我真的不知道「n」字符串的格式。 用例是:我有一個字符串數組,我必須轉換。 – fuerteVentura22

+0

如果你沒有模式,你不能解析任何東西。如何在沒有圖案的情況下區分「1,234.56」和「1.234,56」? – BenB

+0

如果您知道總是有2位小數,您可以選擇小數點分隔符來構建我認爲的模式.... – BenB

1

小數部分是現場八方依賴,所以你可以使用NumberFormat類並使用解析結果作爲字符串從中獲取BigDecimal

示例:

final NumberFormat format = NumberFormat.getInstance(Locale.FRANCE); 
final Number number = format.parse("3,1415"); 
final BigDecimal bd = new BigDecimal(number.toString()); 
System.out.println(bd); 
+0

由於'format.parse' [將返回Double](http:// docs .oracle.com/javase/8/docs/api/java/text/NumberFormat.html#parse-java.lang.String-java.text.ParsePosition-),這會遭遇與[BigDecimal(double )構造函數](http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-double-):與輸入字符串不匹配的不精確的值。 – VGR

+0

爲字符串「s3」打印1.234 – fuerteVentura22

+0

是的,並且1.234是Bigdecimal的有效輸入 –

0

要覆蓋所有的情況下,我建議以下IMPL:

private static BigDecimal convertToBigDecimal(String s) { 
    StringBuilder sb = new StringBuilder(); 

    if (s.indexOf('.') != -1 && s.indexOf(',') != -1) { 
     s = s.replace(',', '.'); 
     String[] ss = s.split("\\."); 
     for (int i = 0; i < ss.length; i++) { 
      if (i > 0 && i == ss.length - 1) { 
       sb.append('.'); 
      } 
      sb.append(ss[i]); 
     } 
    } else if (s.indexOf('.') != -1) { 
     String[] ss = s.split("\\."); 
     if (ss.length > 2) { 
      sb.append(s.replace(".", "")); 
     } else { 
      // assume it is decimal delimiter 
      sb.append(ss[0]).append('.').append(ss[1]); 
     } 
    } else if (s.indexOf(',') != -1) { 
     String[] ss = s.split(","); 
     if (ss.length > 2) { 
      sb.append(s.replace(",", "")); 
     } else { 
      // assume it is decimal delimiter 
      sb.append(ss[0]).append('.').append(ss[1]); 
     } 
    } 

    BigDecimal bd = new BigDecimal(sb.toString()); 
    return bd; 
} 

的想法是第一次檢查,如果我們有兩個比我們絕對有小數部分,我們全部更換,.,然後跳過所有.除最後一個。否則,如果我們有幾個相同的分隔符,它是沒有小數部分的數字。在其他情況下,我們需要知道模式以區分是否有小數。對於樣本編號,我們假定它是用十進制。

+0

對於「1,234,567」(無小數部分),結果將是錯誤的...(1234.567)但這是迄今爲止最好的拍攝... – BenB

+0

你是對的@BenB。區分不知道案例111,222的模式是1112222還是111.222是不真實的。 –

相關問題