Domanda

In Java, sto cercando di ottenere DecimalFormat far rispettare il segno su un segno esponente. Quando è positiva ho bisogno di un segno più a comparire. Da quello che ho letto questa sembra una bazzecola, ma per me che getta sempre un errore. Mi rendo conto che ci possono essere altri metodi per raggiungere il mio obiettivo, ma vorrei capire perché in questo metodo specifico si verifica l'errore.

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

L'errore che viene vomitato:

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)

Apprezzo qualsiasi comprensione. Grazie, Mark

È stato utile?

Soluzione

Un modo semplice:

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

Uscite 1.23456E+02 per il vostro esempio.

Ma non credo ci sia un modo per farlo dall'interno del modello DecimalFormat. O almeno javadoc non indica ce n'è uno.

Modifica trashgod porta in primo piano un punto buono. si sarebbe probabilmente vuole ottenere segni positivi e negativi da DecimalFormatSymbols se si ha intenzione di localizzare questo per diverse regioni.

Modifica 2: Andrei ha sottolineato che E è anche una variabile localizzazione. Spettacoli quello che so di localizzazione.

Altri suggerimenti

Vorrei estendere la soluzione da j flemm . La "E" e "-" non sono costanti, che può essere impostato come DecimalFormatSymbols . Pertanto le sostituzioni devono rispettare questo:

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

Il risultato è:

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

Non credo che il carattere '+' è un carattere accettato in un modello (dopo aver studiato le javadocs). E il modello per per la parte esponenziale si descritta:

 Exponent:
         E MinimumExponent
 MinimumExponent:
         0 MinimumExponent(opt)

Se si aggiunge qualche cosa là sarà confondere il parser. Credo che l'unica opzione è quella di dare il modello normale (senza '+') e quindi ottenere il regex String e l'uso di aggiungere il '+' lì.

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

L'opzione migliore potrebbe essere estendendo DecimalFormat e facendo questo nel metodo format sovrascritto

@j di flemm approccio è interessante perché "esponenti negativi sono formattati utilizzando il segno meno localizzato, non il prefisso e suffisso dal modello." - DecimalFormat .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top