2013-03-10 38 views
8

Tôi đang cố gắng để định dạng một chuỗi để thêm dấu phẩy giữa 3 nhóm chữ sốThêm dấu phẩy (phân tách nhóm) vào số mà không sửa đổi số thập phân?

EG:

1200.20 >> 1,200.20 
15000 >> 15,000 

Tôi đang cố gắng tìm ra cách để làm điều đó với DecimalFormat, đến thời điểm này tôi đã được sử dụng một kịch bản của riêng tôi có vẻ quá phức tạp. Tôi không thể tìm ra cách để làm điều đó, bằng cách sử dụng # chỉ đơn giản là ẩn dấu zeroes và sử dụng 0 thêm chúng vào số.

Đây là những gì tôi đang cố gắng ngay bây giờ:

DecimalFormat df = new DecimalFormat("###,###.####", new DecimalFormatSymbols(Locale.US)); 
resultStr = df.format(Double.valueOf(resultStr)); 

Tôi chắc chắn nó phải là dễ dàng, nhưng tôi không chắc chắn làm thế nào để làm điều đó. Tôi không phải làm điều đó với DecimalFormat, tôi chỉ nghĩ nó sẽ là cách dễ dàng hơn. Làm cách nào tôi có thể thêm dấu phẩy mà không sửa đổi số thập phân theo bất kỳ cách nào?

Trả lời

14

Bạn nên sử dụng đối tượng NumberFormat và đặt đối tượng đó để sử dụng nhóm. Một cái gì đó như

import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.util.Locale; 

public class NumberFormatEg { 
    public static void main(String[] args) { 
     NumberFormat myFormat = NumberFormat.getInstance(); 
     myFormat.setGroupingUsed(true); 

     double[] numbers = { 11220.00, 232323232.24, 121211.55, 102.121212 }; 

     for (double d : numbers) { 
     System.out.println(myFormat.format(d)); 
     } 
     System.out.println(); 

     DecimalFormat decimalFormat = new DecimalFormat("#.00"); 
     decimalFormat.setGroupingUsed(true); 
     decimalFormat.setGroupingSize(3); 

     for (double d : numbers) { 
     System.out.println(decimalFormat.format(d)); 
     } 

     System.out.println("\nFor Germany"); 

     NumberFormat anotherFormat = NumberFormat 
      .getNumberInstance(Locale.GERMAN); 
     if (anotherFormat instanceof DecimalFormat) { 
     DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat; 
     anotherDFormat.applyPattern("#.00"); 
     anotherDFormat.setGroupingUsed(true); 
     anotherDFormat.setGroupingSize(3); 

     for (double d : numbers) { 
      System.out.println(anotherDFormat.format(d)); 
     } 

     } 

     System.out.println("\nFor US:"); 

     anotherFormat = NumberFormat.getNumberInstance(Locale.US); 
     if (anotherFormat instanceof DecimalFormat) { 
     DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat; 
     anotherDFormat.applyPattern("#.00"); 
     anotherDFormat.setGroupingUsed(true); 
     anotherDFormat.setGroupingSize(3); 

     for (double d : numbers) { 
      System.out.println(anotherDFormat.format(d)); 
     } 

     } 
    } 
} 

trả về:

11,220 
232,323,232.24 
121,211.55 
102.121 

11,220.00 
232,323,232.24 
121,211.55 
102.12 

For Germany 
11.220,00 
232.323.232,24 
121.211,55 
102,12 

For US: 
11,220.00 
232,323,232.24 
121,211.55 
102.12 

Một lợi thế của việc này là giải pháp có thể locale cụ thể.

Đã chỉnh sửa
Bây giờ hiển thị ví dụ với đối tượng DecimalFormat. Lưu ý rằng bạn nên đặt kích thước nhóm nếu bạn sử dụng.

+0

A 'DecimalFormat' *** là *** a' NumberFormat' –

+0

@a_horse_with_no_name : true, anh ta có thể gọi 'setGroupingUsed (true)' trên đối tượng DecimalFormat. –

+0

Tôi đã sử dụng mã mặc dù với định dạng thập phân. Tuy nhiên nó sử dụng '.' thay vì dấu phẩy cho các nhóm. Làm thế nào tôi có thể thay đổi nó thành ',' hoặc Locale.US? – lisovaccaro

10

Bạn cũng có thể thử một cái gì đó giống như

DecimalFormat df = new DecimalFormat("#,###.00"); 

System.out.println(df.format(1200.20)); 
System.out.println(df.format(15000)); 
System.out.println(df.format(123456789.99)); 
 
1,200.20 
15,000.00 
123,456,789.99 
+0

Tốt hơn để gọi 'setGroupingUsed (true)' và 'setGroupingSize (3)' khác giải pháp của bạn sẽ không hoạt động với số> 999999.00. –

+0

@HovercraftFullOfEels Dường như hoạt động tốt cho những con số như vậy, ví dụ: '9999999.00' ->' 9,999,999.00'. – arshajii

+0

Tôi rút lại những gì tôi đã nói. 1+ Đó là lá phiếu cuối cùng của tôi còn lại trong ngày. :( –

1

tôi không thể thực hiện bất kỳ của các giải pháp khác hoạt động, một số vòng số thập phân, một số thêm số 0 theo sau hoặc một số loại bỏ số 0.

Tôi không có kế hoạch chấp nhận câu trả lời của riêng mình nhưng tôi sẽ đăng tập lệnh của mình trong trường hợp ai đó thấy nó hữu ích.

public void(String str) { 
    int floatPos = str.indexOf(".") > -1 ? str.length() - str.indexOf(".") : 0; 
    int nGroups= (str.length()-floatPos-1-(str.indexOf("-")>-1?1:0))/3; 
    for(int i=0; i<nGroups; i++){ 
     int commaPos = str.length() - i * 4 - 3 - floatPos; 
    str = str.substring(0,commaPos) + "," + str.substring(commaPos,str.length()); 
    } 
    return str; 
} 


1    => 1 
1.0   => 1.0 
1234.01  => 1,234.01 
1100100.12345 => 1,100,100.12345 
0

Giải pháp đơn giản nhất

Tại sao bạn không sử dụng comma , flag với printf.

System.out.printf("%,d\n", 58625);// the d to accept decimal integer 
System.out.printf("%,.2f", 12345678.9);// the f to accept folouting point and 2 to take only 2 digits 

Sản lượng sẽ

58,625 
12,345,678.90 

Và tin tốt: Các dấu phân cách tạo ra thực tế sử dụng is specific to the user’s locale

Các vấn đề liên quan