2012-08-13 21 views
21

Có cách nào để cắt bớt dấu âm khi kết quả trả về không; trong khi sử dụng định dạng thập phân?Trường hợp ký hiệu âm trong 0 bằng java

DecimalFormat df = new DecimalFormat("#,##0.0"); 
df.setRoundingMode(RoundingMode.HALF_UP); 
formattedValue = df.format("-0.023"); 

Mã trên trả về -0.0. Có cách nào mà nó sẽ trả về chỉ 0.0? Tuy nhiên, tôi muốn giữ lại dấu âm khi kết quả là số âm.

+6

Tôi gặp lỗi: 'Không thể định dạng đối tượng đã cho làm Số '. Bạn nên sử dụng giá trị '-0.023' không phải là chuỗi' "-0.023" ' – alfasin

Trả lời

19

Tôi không nghĩ rằng có một cách để làm việc đó chỉ với DecimalFormat, nhưng điều này một liner sẽ chăm sóc của vấn đề:

formattedValue = formattedValue.replaceAll("^-(?=0(.0*)?$)", ""); 

Nó loại bỏ (thay thế bằng "") dấu trừ nếu nó được theo sau bởi 0-n ký tự của "0.00000...", do đó, điều này sẽ làm việc cho bất kỳ kết quả tương tự như "-0", "-0." hoặc "-0.000000000"

Dưới đây là một số mã kiểm tra:

public static void main(String[] args) { 
    System.out.println(format(-0.023)); 
    System.out.println(format(12.123)); 
    System.out.println(format(-12.345)); 
    System.out.println(format(-0.123)); 
    System.out.println(format(-1.777)); 
} 

public static String format(double number) { 
    DecimalFormat df = new DecimalFormat("#,##0.0"); 
    df.setRoundingMode(RoundingMode.HALF_UP); 
    String formattedValue = df.format(number); 
    formattedValue = formattedValue.replaceAll("^-(?=0(.0*)?$)", ""); 
    return formattedValue; 
} 

Output (như dự kiến):

0.0 
12.1 
-12.3 
-0.1 
-1.8 
2

Hãy thử điều này: DecimalFormat df = new DecimalFormat("#,##0.0#;(#,##0.0#)");

Theo Javadoc for DecimalFormat:

A DecimalFormat pattern contains a positive and negative subpattern, for example, "#,##0.00;(#,##0.00)". Each subpattern has a prefix, numeric part, and suffix. The negative subpattern is optional; if absent, then the positive subpattern prefixed with the localized minus sign ('-' in most locales) is used as the negative subpattern. That is, "0.00" alone is equivalent to "0.00;-0.00". If there is an explicit negative subpattern, it serves only to specify the negative prefix and suffix; the number of digits, minimal digits, and other characteristics are all the same as the positive pattern. That means that "#,##0.0#;(#)" produces precisely the same behavior as "#,##0.0#;(#,##0.0#)".

+0

Doex giải pháp này không hoạt động. Cung cấp kết quả đáng kinh ngạc. – Pravat

1

Đó bằng séc nếu giá trị tính toán = "-0,0" làm cho nó bình đẳng "0.0"

và bạn có thể mã hóa mã sush dưới dạng

public String getFormattedValue(String input) { 
     DecimalFormat df = new DecimalFormat("#,##0.0"); 
     df.setRoundingMode(RoundingMode.HALF_UP); 
     String formattedValue = df.format(input); 

     if (formattedValue.equalsIgnoreCase("-0.0")) { 
      formattedValue = "0.0"; 
     } 

     System.out.println(formattedValue); 
     return formattedValue; 
    } 
+1

Điều này hoạt động nhưng, trở thành một kiểm tra rõ ràng. Sẽ không hoạt động nếu giá trị là -0.00 vv. – Pravat

3

Tôi nghĩ rằng đây sẽ là một giải pháp để tránh -0.0. Sử dụng đoạn mã sau:

DecimalFormat df = new DecimalFormat("#,##0.0"); 
df.setRoundingMode(RoundingMode.HALF_UP);  
df.setNegativePrefix(""); // set negative prefix BLANK 
String formattedValue = df.format(-0.023); 
df.setNegativePrefix("-"); // set back to - again 
System.out.println(formattedValue); 

Output:

0.0 
+1

Tôi cũng đã đặt mã trên vào một phương thức tiện ích. Mặc dù nó hoạt động cho 0.0; nó không hoạt động đối với các số âm khác mà tôi cần giữ lại dấu -ve.đặt lại tiền tố âm không có bất kỳ hiệu ứng nào khi mỗi cá thể DecimalFormat được tạo. – Pravat

+0

Bạn không nên đặt cách giải quyết trong các lớp tiện ích của mình. Hãy để nó ở đó, nơi bạn đang sử dụng nó và giữ cho nó được đánh dấu bằng các dấu hiệu như // FIXME. Vì vậy, lần sau nếu bạn tìm thấy giải pháp tốt hơn, bạn có thể thực hiện điều đó. Tôi đặt lại 'Tiền tố âm 'ở trên với ý định, nếu bạn định sử dụng lại' df' lần nữa cho các số khác nhau. Nếu bạn định sử dụng 'instance mới' thì nó không cần thiết. –

0

tôi tìm ra -0 khá hữu ích vì nó thông báo cho bạn rằng giá trị được làm tròn thực ra là tiêu cực (có thể có rất nhiều ý nghĩa đối với một số chức năng). Vấn đề duy nhất đối với tôi là -1 * 0 thực sự thực sự là 0 và phải được định dạng là 0 mặc dù nó không phải là với các trình định dạng Java.

Các định dạng sau đây chăm sóc đó, mà không cần phải tốn kém của String thao tác (đặc biệt là regexps):

public static String formatWithoutMinusZeroIssue(double d, DecimalFormat yourFormatter) { 
    if (d == 0) { 
     return yourFormatter.format(0); 
    } else { 
     return yourFormatter.format(d); 
    } 
} 

này sử dụng thực tế là mặc dù -1 * 00 được định dạng khác nhau, họ đều bình đẳng.

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