Вопрос Java DecimalFormat об экспоненциальном представлении

Виртуальные классы не то же как виртуальное наследование. Виртуальные классы, которых Вы не можете инстанцировать, виртуальное наследование, являются чем-то еще полностью.

Википедия описывает его лучше, чем я могу. http://en.wikipedia.org/wiki/Virtual_inheritance

5
задан Community 23 May 2017 в 12:24
поделиться

2 ответа

Вот один способ. Возможно, хоккей, но это работает ...

public class DecimalFormatTest extends TestCase {
    private static class MyFormat extends NumberFormat {
        private final DecimalFormat decimal;

        public MyFormat(String pattern) {
            decimal = new DecimalFormat(pattern);
        }

        public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
            StringBuffer sb = new StringBuffer();
            sb.append(modified(Math.abs(number) > 1.0, decimal.format(number, toAppendTo, pos).toString()));
            return sb;
        }

        private String modified(boolean large, String s) {
            return large ? s.replace("E", "E+") : s;
        }

        public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
            StringBuffer sb = new StringBuffer();
            sb.append(modified(true, decimal.format(number, toAppendTo, pos).toString()));
            return sb;
        }

        public Number parse(String source, ParsePosition parsePosition) {
            return decimal.parse(source, parsePosition);
        }

        public void setPositivePrefix(String newValue) {
            decimal.setPositivePrefix(newValue);
        }
    }
    private MyFormat    format;

    protected void setUp() throws Exception {
        format = new MyFormat("0.0E0");
        format.setPositivePrefix("+");
    }

    public void testPositiveLargeNumber() throws Exception {
        assertEquals("+1.0E+2", format.format(100.0));
    }

    public void testPositiveSmallNumber() throws Exception {
        assertEquals("+1.0E-2", format.format(0.01));
    }

    public void testNegativeLargeNumber() throws Exception {
        assertEquals("-1.0E+2", format.format(-100.0));
    }

    public void testNegativeSmallNumber() throws Exception {
        assertEquals("-1.0E-2", format.format(-0.01));
    }
}

В качестве альтернативы вы можете создать подкласс DecimalFormat, но я считаю, что в целом лучше не создавать подклассы из конкретных классов.

2
ответ дан 13 December 2019 в 22:13
поделиться

Не могли бы вы использовать вместо этого printf () :

Format format = new DecimalFormat("0.0E0");
Double d = new Double(.01);
System.out.println(format.format(d));
System.out.printf("%1.1E\n", d);
d = new Double(100);
System.out.println(format.format(d));
System.out.printf("%1.1E\n", d);

Вывод:

1.0E-2
1.0E-02
1.0E2
1.0E+02

Если вам нужно вывести вместо этого String , вы можете использовать информацию, представленную на Форматировано Печать для Java (sprintf) для этого.

РЕДАКТИРОВАТЬ: Вау, эта штука PrintfFormat () огромна и кажется ненужной:

OutputStream b = new ByteArrayOutputStream();
PrintStream p = new PrintStream(b);
p.printf("%1.1E", d);
System.out.println(b.toString());

Я получил идею для приведенного выше кода from Получить поток вывода в строку .

3
ответ дан 13 December 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: