2012-08-13 26 views
21

¿Hay alguna manera de truncar el signo negativo cuando el resultado devuelve cero; mientras usa formato decimal?Signo negativo en caso de cero en java

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

El código anterior arroja -0.0. ¿Hay alguna manera por la cual devolverá solo 0.0? Sin embargo, quiero conservar el signo negativo cuando el resultado es un número negativo.

+6

Aparece un error: 'No se puede formatear el Objeto dado como un Número'. Debería usar el valor '-0.023' no la cadena' "-0.023" ' – alfasin

Respuesta

19

No creo que hay una manera de hacerlo solo con DecimalFormat, pero esto de una sola línea se ocupa del problema:

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

Elimina (reemplaza con "") el signo menos si va seguido de 0-n caracteres de "0.00000...", por lo que esto funcionará para cualquier resultado similar como "-0", "-0." o "-0.000000000"

Aquí hay algo de código de prueba:

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

de salida (como se esperaba):

0.0 
12.1 
-12.3 
-0.1 
-1.8 
2

Prueba esto: DecimalFormat df = new DecimalFormat("#,##0.0#;(#,##0.0#)");

De acuerdo con la 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

Esta solución doex no funciona. Da resultados extraños – Pravat

1

Que mediante cheque si el valor calculado = "-0.0" que sea igual a "0.0"

y que pueda capsular el código sush como

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

Esto funciona pero se convierte en una verificación explícita. No funcionará si el valor es -0.00 etc. – Pravat

3

Creo que esto sería una solución para evitar -0.0. Utilice el código siguiente:

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

Salida:

0.0 
+1

Bueno, he puesto el código anterior en un método de utilidad. Aunque funciona para 0.0; no funciona para otros números negativos donde necesito conservar el signo -ve.restablecer el prefijo negativo no tiene ningún efecto como cada vez que se crea la instancia de DecimalFormat. – Pravat

+0

No debe poner soluciones provisionales en sus clases de utilidad. Déjalo allí donde lo estés usando y manténlo marcado con marcadores como // FIXME. Entonces, la próxima vez, si encuentras una mejor solución, puedes implementar eso. Restablecí el 'Prefijo Negativo' anterior con intención, si vas a usar la instancia 'df' nuevamente para diferentes números. Si va a usar 'nueva instancia', entonces no es necesario. –

0

encuentro la -0 bastante útil, ya que le informa que el valor redondeado de hecho fue negativo (lo que puede tener un gran significado para algunas funciones). El único problema para mí es que -1 * 0 es realmente realmente 0 y debe formatearse como 0, aunque no está en formateadores Java.

La siguiente formateador se encarga de que, sin el alto costo de manipulación de cadenas (especialmente las expresiones regulares):

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

Este utiliza el hecho de que aunque -1 * 0 y 0 tienen un formato diferente, son iguales.

Cuestiones relacionadas