2017-04-20 98 views
0

我試圖格式化數字看起來像某種方式。雙特定格式和兩位小數

所以,我有一個像數1007,2,我希望它看起來像1 007,20

需要這有兩個因素:

  • 成千上萬格式
  • 小數點後兩位

我有一個設置數千格式的代碼:

Double total_value = Double.valueOf(1007,2); 

String formatedValue = NumberFormat.getNumberInstance(Locale.CANADA_FRENCH).format(total_value); 

,輸出是: 1 007,2€

而且我對兩位小數代碼:

Double total_value = Double.valueOf(1007,2); 

String formatedValue = String.format("%.2f", total_value); 

的問題是,使用這種兩格式化方法同時總是有問題,因爲它們中的兩個返回字符串,並且都需要接收Double中的格式化值。

如果我收到一個String中,當我嘗試解析,以雙倍的字符串像String value = Double.parseDouble(formatedValue);String value = Double.valueOf(formatedValue)他們總是得到一個錯誤。我已經嘗試了DecimalFormat但它也返回一個字符串。

所以,我不知道如何做兩個方法共同工作!

如果您有任何想法,請評論吧:)

+0

您是否試圖單獨處理數字和小數部分,然後連接結果(去除十進制字符串的兩個第一個字符)? – Anis

+0

請注意,'Double.valueOf(1007,2);'不能編譯。雖然我們可以猜出您的意思,但最好將實際代碼複製/粘貼到您的問題中。 – slim

回答

3

你不想合併NumberFormatString.format()


您可以進一步配置NumberFormat對象來告訴它使用兩個小數位:

NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.CANADA_FRENCH); 
    numberFormat.setMinimumFractionDigits(2); 

    assertThat(numberFormat.format(1007.2), is("1 007,20")); 

(也可能是setMaximumFractionDigits()等,根據您的需要 - 看到的Javadoc)

小心 - NumberFormat.format()不是線程安全的。


或者您可以使用String.format(locale, format, args)

assertThat(String.format(Locale.CANADA_FRENCH, "%,.2f", 1007.2), is("1 007,20")); 

格式的,標誌告訴格式化使用千位分隔符,和現場告訴它的分隔符是空格。

+0

這是第一個選擇真的很好!謝謝你這樣:) –

0

設置一千格式,你可以做些事情像後:

String[] splitter = formatedValue.split("\\,"); 
int decimalDigits = 0; 
if (splitter.length > 1) { 
    formatedValue = splitter[1].length(); 
} else { 
    formatedValue += ","; 
} 
for (int i = 0; i < 2 - decimalDigits; i++) { 
    formatedValue += "0"; 
} 

我沒有測試過這一點,它是不是很漂亮,但我使用了英文格式類似的東西。

爲確保您只有兩位小數位,您應該在開始時將您的總價值舍入。