2015-07-22 43 views
3

對我的要求是,用戶應該能夠從一種形式(數量將是一個字符串)輸入任何有效的數字。應用程序應使用美式格式的逗號來格式化字符串數字,而不進行任何四捨五入。這個格式化的數字將打印在一封信中,郵寄給客戶。大多數數字格式化程序會在指定的精度之後對數字進行四捨五入。這在Java中是必需的,但任何語言的任何算法都可以。我可以將它編碼到Java。如何格式化沒有四捨五入的字符串數字?

例子:

 
Input    Output 
-1.0    -1.0 
123     123 
1234    1,234 
123456    123,456 
-123456    -123,456 
-123456.01   -123,456.01 
1234.79999999  1,234.79999999 
1234567.79999999 1,234,567.79999999 
-1234567.79999999 -1,234,567.79999999 

有使用的DecimalFormat爲回答這個問題一個問題:Add commas (grouping separator) to number without modifying decimals?

如果如下定義它,那麼你就被限制爲2位小數。如果增加格式模式中零的數量,那麼小數位數也會增加,但是是固定的。另外,如果你輸入2.1,你會得到2.10。我需要2.1。如果您輸入11220.999,那麼結果將是11,221.00。我需要11220.999。

DecimalFormat decimalFormat = new DecimalFormat("#.00"); 
+0

的可能重複的[?添加逗號(分組分離器)與數而無需修改小數](HTTP://計算器。com/questions/15328647/add-commas-grouping-separator-to-number-without-modifying-decimals) –

+0

@PhamTrung這是一個重複我相信 –

+0

@PhamTrung我需要更多的「原樣」格式。如果你將格式模式定義爲「#.0000」,那麼2.1會給你2.1000。我需要2.1。 –

回答

4
String number = "-123456.799999"; 
    double realnumber = Double.parseDouble(number); 
    NumberFormat nf = NumberFormat.getInstance(Locale.US); 
    nf.setMaximumFractionDigits(10); 
    System.out.printf("%s", nf.format(realnumber)); 
    // System.out.println(nf.format(realnumber)); // both work 

結果-123,456.799999

說明: nf.setMaximumFractionDigits(n); 將其設置爲你想要顯示數字的最高金額。所有逗號後的數字或小於這個數字的數字都會按照您希望的方式顯示。逗號後只有數字更多數字將舍入。

編輯使用使用concat

大數
String number = "-12342342353356.799999123456789"; 
int startIndex = number.length()-3; 
if(number.indexOf(".") >= 0) { 
    startIndex = number.indexOf(".") - 3; 
} 
int negative = (number.charAt(0) == '-' ? 1 : 0); 
for (int i = startIndex; i > 0 + negative; i -= 3) { 
    number = number.substring(0, i) + "," + number.substring(i); 
} 
System.out.println(number); 

結果:-12,342,342,353,356.799999123456789

+0

上給出一個像-999999999.999999的輸入,結果顯示-9,999,999,999.999998。有沒有什麼辦法可以讓最後的8個成爲9? –

+0

這就是雙打。如果你需要更大的數字,你需要另一種解決方案 – dly

+0

你的方式不好。 123.123456789012怎麼樣?它不會顯示爲10位以上的十進制數字。 OP希望按原樣添加逗號「僅精確度沒有定義,它應該按照格式顯示,但只是格式化,如果用戶給出2個小數位,那麼它應該給出2個小數位的輸出。如果5,那麼5「。此外double不能正確表示大多數十進制數 –

1

你需要的是:

NumberFormat format = NumberFormat.getNumberInstance(Locale.US); 
format.setMaximumFractionDigits(Integer.MAX_VALUE); 
System.out.println(format.format(Double.valueOf("2.10"))); 
System.out.println(format.format(Double.valueOf("11220.999"))); 
System.out.println(format.format(Double.valueOf("-1234567.79999999"))); 

輸出:

2.1 
11,220.999 
-1,234,567.79999999 
-999,999,999.999999 

對於更大的字符串,您可能需要使用BigDecimal

BigDecimal de = new BigDecimal("-999999999.99999999999999999999"); 
System.out.println(format.format(de)); 

輸出

-999,999,999.99999999999999999999 
+0

最後一個數字取消:-( –

+0

@RakeshGaria更新 –

+1

@RakeshGaria看到我更新的答案,它會解決你的問題 –

1
double number = -999999999.999999; 

    NumberFormat nf = NumberFormat.getNumberInstance(); 
    nf.setMaximumFractionDigits(10); 
    nf.setRoundingMode(RoundingMode.FLOOR); 

    System.out.println(nf.format(number)); 

結果:

-999,999,999.999999 

另一種方式來處理很長的數字作爲字符串

String number = "999999999999999.9999999999998881928391283"; 

    BigDecimal bd = new BigDecimal(number); 

    NumberFormat format = NumberFormat.getNumberInstance(); 

    StringBuilder sb = new StringBuilder(); 
    sb.append(format.format(bd.longValue())); 

    int index = number.indexOf('.'); 
    if (index > -1) { 
     sb.append(number.substring(index)); 
    } 
    System.out.println(sb); 

結果:

999,999,999,999,999.9999999999998881928391283 
+0

這也很好 –