Pregunta

En Java, estoy tratando de conseguir DecimalFormat para hacer cumplir la señal en una señal exponente. Cuando es positiva necesito un signo de más en aparecer. De lo que he leído esto parece una obviedad, pero para mí siempre arroja un error. Soy consciente de que puede haber otros métodos para lograr mi objetivo, pero me gustaría entender por qué en este método específico se produce el error.

Double result = 123.456;
String sresult;

//This works
NumberFormat formatter = new DecimalFormat("0.00000E00");
        sresult = formatter.format(result); 
        System.out.println(sresult);        //1.23456E02

//This doesn't work
formatter = new DecimalFormat("0.00000E+00"); //Want to enforce the sign to appear
        sresult = formatter.format(result); 
        System.out.println(sresult);        //Expected 1.23456E+02 but error occurs

El error que se lanza hacia arriba:

Exception in thread "main" java.lang.IllegalArgumentException:
Malformed exponential pattern "0.00000E+00"
    at java.text.DecimalFormat.applyPattern(Unknown Source)
    at java.text.DecimalFormat.(Unknown Source)
    at deccheck.main(deccheck.java:13)

aprecio cualquier penetración. Gracias, Marcos

¿Fue útil?

Solución

Una forma sencilla:

formatter = new DecimalFormat("0.00000E00"); // Want to enforce the sign to appear
sresult = formatter.format(result);
if (!sresult.contains("E-")) { //don't blast a negative sign
    sresult = sresult.replace("E", "E+");
}
System.out.println(sresult);

Salidas 1.23456E+02 por su ejemplo.

Pero no creo que hay una manera de hacerlo desde el interior del patrón DecimalFormat. O al menos el javadoc no indica que hay uno.

Editar trashgod lleva a un punto bueno. Probablemente usted desea conseguir signos positivos y negativos de DecimalFormatSymbols si usted planea en la localización de este a diferentes regiones.

Editar 2: Andrei señaló que E es también una variable de localización. Muestra lo que saben acerca de la localización.

Otros consejos

Me gustaría ampliar la solución por . El "E" y "-" hay constantes, que se puede establecer como DecimalFormatSymbols . Por lo tanto las sustituciones deben respetar esta:

public static String hoola(final String s, final DecimalFormatSymbols symbols) {
    String result;
    final String expo = symbols.getExponentSeparator();
    final char minus = symbols.getMinusSign();
    if (!s.contains(expo + minus)) { // don't blast a negative sign
    result = s.replace(expo, expo + '+');
    } else {result=s;}
    return result;
}

/**
 * @param args
 */
public static void main(final String[] args) {
    final DecimalFormat decForm = (DecimalFormat) NumberFormat
            .getInstance(Locale.GERMAN);
    final DecimalFormatSymbols newSymbols = new DecimalFormatSymbols(
            Locale.GERMAN);
    newSymbols.setExponentSeparator("*10^");
    newSymbols.setMinusSign('\u2212');
    decForm.setDecimalFormatSymbols(newSymbols);
    decForm.applyPattern("0.00000E00");
    System.out.println(hoola(decForm.format(1234.567), decForm
            .getDecimalFormatSymbols()));
    System.out.println(hoola(decForm.format(000.00567), decForm
            .getDecimalFormatSymbols()));
}

El resultado es:

  • 1,23457 * 10 ^ 03 +
  • 5,67000 x 10 ^ -03

No creo que el carácter '+' es un carácter aceptada en un patrón (después de estudiar los javadocs). Y el patrón de la parte de Si exponencial descrita como:

 Exponent:
         E MinimumExponent
 MinimumExponent:
         0 MinimumExponent(opt)

Si añade nada hay que confundir el analizador. Creo que su única opción es darle el patrón normal (sin '+') y luego obtener la expresión regular y el uso de cuerdas para añadir el '+' allí.

sresult = formatter.format(result);
sresult = sresult.replaceAll("E([^\\-]+)", "E+$1");

La mejor opción podría ser extendiendo DecimalFormat y hacer esto en el método sobrescribe formato

enfoque

@j de Flemm es atractiva porque "exponentes negativos se formatean usando el signo menos localizada, no el prefijo y el sufijo del patrón." - DecimalFormat .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top