2010-09-08 44 views
100

Cách tốt nhất để định dạng số sau được cấp cho tôi dưới dạng Chuỗi là gì?Làm cách nào để định dạng số Chuỗi để có dấu phẩy và vòng?

String number = "1000500000.574" //assume my value will always be a String 

Tôi muốn đây là một String với giá trị: 1,000,500,000.57

Làm thế nào tôi có thể định dạng nó như vậy?

+0

Làm thế nào chúng ta có thể làm như vậy nếu chúng ta cần 1 , 00,05,00,000,57 là đầu ra? – Anand

Trả lời

202

Bạn có thể muốn xem lớp học DecimalFormat; nó hỗ trợ các miền địa phương khác nhau (ví dụ: ở một số quốc gia sẽ được định dạng là 1.000.500.000,57 thay thế).

Bạn cũng cần phải chuyển đổi chuỗi thành một số, điều này có thể được thực hiện với:

double amount = Double.parseDouble(number); 

mẫu Mã số:

String number = "1000500000.574"; 
double amount = Double.parseDouble(number); 
DecimalFormat formatter = new DecimalFormat("#,###.00"); 

System.out.println(formatter.format(amount)); 
+0

bạn có thể trình bày một ví dụ về cách tôi có thể sử dụng NumberFormat với trường hợp cụ thể này không? –

+1

Mà có lẽ là một dấu hiệu của giải pháp không rõ ràng cho vấn đề ... – LeviX

+1

bạn cũng có thể sử dụng dưới đây giải pháp - public static String getRoundOffValue (giá trị gấp đôi) { \t \t \t \t DecimalFormat df = new DecimalFormat (" ##, ##, ##, ##, ##, ##, ## 0.00 "); \t \t trả về df.format (giá trị); } –

29

Một khi bạn đã chuyển đổi chuỗi của bạn để một con số, bạn có thể sử dụng

// format the number for the default locale 
NumberFormat.getInstance().format(num) 

hoặc

// format the number for a particular locale 
NumberFormat.getInstance(locale).format(num) 
+0

Làm cách nào để chỉ định ngôn ngữ * và * tròn thành (nói) 2 số thập phân? – Jonik

+5

Ah, đừng bận tâm, tìm thấy nó: 'new DecimalFormat (" 0. ## ", DecimalFormatSymbols.getInstance (locale))' – Jonik

10

Tôi đã tạo tiện ích định dạng của riêng mình. Mà là cực kỳ nhanh tại xử lý định dạng cùng với đem lại cho bạn nhiều tính năng :)

Nó hỗ trợ:

  • Comma Formatting Ví dụ: 1234567 trở thành 1,234,567.
  • Tiền tố với "Ngàn (K), Triệu (M), Tỷ (B), Trillion (T)".
  • Độ chính xác từ 0 đến 15.
  • Định lại kích thước chính xác (Có nghĩa là nếu bạn muốn có độ chính xác 6 chữ số, nhưng chỉ có 3 chữ số có sẵn, nó buộc nó thành 3).
  • Giảm tiền tố (Có nghĩa là nếu tiền tố bạn chọn quá lớn, nó sẽ giảm tiền tố thành tiền tố phù hợp hơn).

Mã này có thể được tìm thấy here. Bạn gọi nó như sau:

public static void main(String[]) 
{ 
    int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS; 
    String formatted = ValueFormat.format(1234567, settings); 
} 

Tôi cũng nên chỉ ra điều này không xử lý hỗ trợ thập phân, nhưng rất hữu ích cho các giá trị số nguyên. Ví dụ trên sẽ hiển thị "1.23M" làm đầu ra. Tôi có lẽ có thể thêm hỗ trợ thập phân có thể, nhưng không thấy quá nhiều sử dụng cho nó kể từ đó tôi cũng có thể hợp nhất này vào một loại BigInteger của lớp xử lý nén char [] mảng cho tính toán toán học.

+2

Điều này là tốt nếu bạn chỉ làm việc bằng tiếng Anh. Đề nghị của tôi là để tránh một điều như nó pissed bữa ăn tối của người dùng không phải tiếng Anh của tôi như họ không thể hiểu những gì 'K' hoặc' M' có nghĩa là – rishabhmhjn

+0

@rishabhmhjn nhưng ... couldnt bạn chỉ cần tinh chỉnh nó để sửa đổi bất kỳ thư bạn nhu cầu? là may mắn của bạn lỗi của mình? : o và những gì anh ấy tạo ra khá thú vị, mặc dù liên kết dường như không khả dụng ngay bây giờ .. –

+0

@AquariusPower vấn đề là, ví dụ: số tiếng Nhật không tuân theo hệ thống số liệu. Con số của họ giống như 1 百 cho 100, 1 千 cho 1000, 1 万 cho 10000, sau đó nó trở thành 1 千万 cho 1000,0000. Nhóm của tôi đã làm việc trên một cái gì đó tương tự trong Javascript. Bạn có thể sử dụng logic được đề cập trong phần này: https://github.com/statusbrew/angular-bignumber – rishabhmhjn

2

Câu trả lời đầu tiên hoạt động rất tốt, nhưng đối với ZERO/0 nó sẽ định dạng như .00

Do đó định dạng #, ## 0.00 đang làm việc tốt cho tôi. Luôn kiểm tra các số khác nhau như 0/100/2334.30 và các số âm trước khi triển khai vào hệ thống sản xuất.

4

bạn cũng có thể sử dụng dưới đây giải pháp -

public static String getRoundOffValue(double value){ 

     DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00"); 
     return df.format(value); 
} 
6
public void convert(int s) 
{ 
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s)); 
} 

public static void main(String args[]) 
{ 
    LocalEx n=new LocalEx(); 
    n.convert(10000); 
} 
-2

Lớp này là dành cho đơn giản formatter giá Ấn Độ

public class Test { 

public static void main (String a[]){ 
    System.out.println(priceFormatter("10023"));  
} 
/** 
* This method is to convert the price into Indian price 
* separator format 
* @param inputPrice 
* @return 
*/ 
public static String priceFormatter(String inputPrice){ 
    try { 
     if(!isNumeric(inputPrice)){ 
      return inputPrice; 
     } 
     // to check if the number is a decimal number 
     String newPrice = "",afterDecimal = ""; 
     if(inputPrice.indexOf('.') != -1){ 
      newPrice = inputPrice.substring(0,inputPrice.lastIndexOf('.')); 
      afterDecimal = inputPrice.substring(inputPrice.lastIndexOf('.')); 
     }else{ 
      newPrice = inputPrice; 
     } 
     int length = newPrice.length(); 
     if (length < 4) { 
      return inputPrice; 
     } 
     // to check whether the length of the number is even or odd 
     boolean isEven = false; 
     if (length % 2 == 0) { 
      isEven = true; 
     } 
     // to calculate the comma index 
     char ch[] = new char[length + (length/2 - 1)]; 
     if (isEven) { 
      for (int i = 0, j = 0; i < length; i++) { 
       ch[j++] = inputPrice.charAt(i); 
       if (i % 2 == 0 && i < (length - 3)) { 
        ch[j++] = ','; 
       } 
      } 
     } else { 
      for (int i = 0, j = 0; i < length; i++) { 
       ch[j++] = inputPrice.charAt(i); 
       if (i % 2 == 1 && i < (length - 3)) { 
        ch[j++] = ','; 
       } 
      } 
     } 
     // conditional return based on decimal number check 
     return afterDecimal.length() > 0 ? String.valueOf(ch) + afterDecimal : String.valueOf(ch); 

    } catch(NumberFormatException ex){ 
     ex.printStackTrace(); 
     return inputPrice; 
    } 
     catch (Exception e) { 
     e.printStackTrace(); 
     return inputPrice; 
    } 
} 

} 
3

Bạn có thể làm toàn bộ chuyển đổi trong một dòng, sử dụng mã sau:

String number = "1000500000.574"; 
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number)); 

Hai dấu # cuối cùng trong hàm tạo DecimalFormat cũng có thể là 0. Dù bằng cách nào cũng hiệu quả.

19

Điều này cũng có thể được thực hiện bằng cách sử dụng String.format(), có thể dễ dàng và/hoặc linh hoạt hơn nếu bạn định dạng nhiều số trong một chuỗi.

String number = "1000500000.574"; 
    Double numParsed = Double.parseDouble(number); 

    System.out.println(String.format("The input number is: %,.2f", numParsed)); 
    // Or 
    String numString = String.format("%,.2f", numParsed); 

Đối với chuỗi định dạng "%, 2f" - "," có nghĩa là các nhóm chữ số riêng biệt bằng dấu phẩy và ".2" có nghĩa là làm tròn đến hai vị trí sau dấu thập phân.

Để tham khảo trên tùy chọn định dạng khác, xem https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

+1

imo giải pháp đẹp nhất, hoạt động chính xác như mong đợi –

+1

hoạt động như một nét duyên dáng –

2

Dưới đây là cách đơn giản nhất để đạt được điều đó:

String number = "10987655.876"; 
double result = Double.parseDouble(number); 
System.out.println(String.format("%,.2f",result)); 

đầu ra: 10,987,655.88

+0

tính năng này không hoạt động trên Android –

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