Java DecimalFormat создает ошибку при применении знака экспоненты - PullRequest
2 голосов
/ 06 августа 2010

В Java я пытаюсь заставить DecimalFormat принудительно использовать знак на показателе степени.Когда оно будет положительным, мне нужен знак плюс.Из того, что я прочитал, это кажется легким делом, но для меня это всегда вызывает ошибку.Я ценю, что могут быть другие методы для достижения моей цели, но я хотел бы понять, почему в этом конкретном методе происходит ошибка.

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

Ошибка, которая выдается:*

Я ценю любое понимание.Спасибо, Марк

Ответы [ 4 ]

3 голосов
/ 06 августа 2010

Я бы хотел расширить решение на j flemm . «E» и «-» не являются константами, их можно установить как DecimalFormatSymbols . Поэтому замены должны уважать это:

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

Результат:

  • 1,23457 * 10 ^ + 03
  • 5,67000 * 10 ^ -03
3 голосов
/ 06 августа 2010

Простой способ:

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

Выводы 1.23456E+02 для вашего примера.

Но я не верю, что есть способ сделать это из шаблона DecimalFormat.Или, по крайней мере, Javadoc не указывает, что он есть.

Редактировать: trashgod поднимает хорошую мысль.Возможно, вы захотите получить положительные и отрицательные признаки от DecimalFormatSymbols, если вы планируете локализовать это в разных регионах.

Редактировать 2: Андрей отметил, что E также являетсяпеременная локализации.Показывает, что я знаю о локализации.

1 голос
/ 06 августа 2010
Подход

@ j flemm привлекателен, поскольку «Отрицательные показатели отформатированы с использованием локализованного знака минус, а не префикса и суффикса из шаблона.» - DecimalFormat.

1 голос
/ 06 августа 2010

Я не думаю, что символ '+' является принятым символом в шаблоне (после изучения javadocs). И шаблон для экспоненциальной части Си описывается как:

 Exponent:
         E MinimumExponent
 MinimumExponent:
         0 MinimumExponent(opt)

Если вы добавите туда что-нибудь, это запутает синтаксический анализатор. Я думаю, что ваш единственный вариант - дать ему нормальный шаблон (без «+»), а затем получить строку и использовать регулярное выражение для добавления «+».

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

Наилучшим вариантом может быть расширение DecimalFormat и выполнение этого в методе перезаписанного формата

...