2012-08-13 16 views
21

Czy istnieje sposób na obcięcie znaku ujemnego, gdy wynik zwraca zero; podczas używania formatu dziesiętnego?Znak ujemny w przypadku zera w java

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

Powyższy kod zwraca wartość -0,0. Czy istnieje sposób, aby zwrócił tylko 0.0? Jednak chcę zachować znak ujemny, gdy wynik jest liczbą ujemną.

+6

Pojawia się błąd: "Nie można sformatować danego obiektu jako liczby". Powinieneś użyć wartości '-0.023', a nie ciągu' "-0.023" ' – alfasin

Odpowiedz

19

Nie sądzę, istnieje sposób to zrobić tylko z DecimalFormat, ale ta jedna wkładka dba o problemie:

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

Usuwa (zamienia z "") znak minus, jeśli po nim następuje 0-n znaków z "0.00000...", więc będzie działać dla dowolnego podobnego wyniku takich jak "-0", "-0." lub "-0.000000000"

Oto niektóre kodu testu:

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; 
} 

wyjścia (zgodnie z oczekiwaniami):

0.0 
12.1 
-12.3 
-0.1 
-1.8 
2

Spróbuj tego: DecimalFormat df = new DecimalFormat("#,##0.0#;(#,##0.0#)");

Według 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

To rozwiązanie nie działa. Daje dziwne wyniki. – Pravat

1

To czekiem jeżeli obliczona wartość = "-0,0" sprawiają, że równy "0.0"

i można rozpakuj kod sush jako

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

To działa, ale staje się wyraźnym sprawdzeniem. Nie zadziała, jeśli wartość wynosi -0,00 itd. – Pravat

3

Myślę, że byłoby to obejście problemu, aby uniknąć -0.0. Użyj następującego kodu:

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); 

wyjściowa:

0.0 
+1

Cóż, umieściłem powyższy kod w metodzie narzędzia. Chociaż działa na 0,0; to nie działa dla innych liczb ujemnych, w których muszę zachować znak -ve.resetowanie ujemnego prefiksu nie ma żadnego efektu, jak za każdym razem, gdy tworzona jest instancja DecimalFormat. – Pravat

+0

Nie należy umieszczać obejść w klasach narzędzi. Niech będzie tam, gdzie go używasz i trzymaj go oznaczonego znacznikami, np. // FIXME. Więc następnym razem, jeśli znajdziesz lepsze rozwiązanie, możesz to zaimplementować. Zresetowałem "Prefiks ujemny" powyżej z zamiarem, jeśli zamierzasz ponownie użyć instancji 'df' dla różnych liczb. Jeśli zamierzasz użyć 'nowej instancji', to nie jest to konieczne. –

0

uważam -0 całkiem przydatna, ponieważ informuje, że wartość zaokrągloną był w rzeczywistości negatywny (co może mieć wiele znaczeń dla niektórych funkcji). Jedynym problemem dla mnie jest to, że -1 * 0 faktycznie jest 0 i powinno być sformatowane jako 0, chociaż nie jest to z formaterami Java.

Poniżej formater dba o to, bez kosztownej kosztów łańcuchach (szczególnie wyrażeniach)

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

ta wykorzystuje fakt, że chociaż -1 * 0 i 0 są w różny sposób, są równe.