Java DecimalFormat科学记数法问题

我使用Java的DecimalFormat类以科学记数法打印出数字。 但是,我有一个问题。 无论价值如何,我都需要这些字符串的长度是固定的,而十的幂的符号会把它扔掉。 目前,这是我的格式:

DecimalFormat format = new DecimalFormat("0.0E0");

这给了我以下组合:1.0E1,1.0E-1,-1.0E1和-1.0E-1。

我可以使用setPositivePrefix来获得:+ 1.0E1,+ 1.0E-1,-1.0E1和-1.0E-1,或者我喜欢的任何东西,但它不会影响力量的符号!

有没有办法做到这一点,以便我可以有固定长度的字符串? 谢谢!

编辑:啊,所以没有办法使用Java的现有DecimalFormat API来完成它? 感谢您的建议! 我想我可能必须继承DecimalFormat,因为我受到已经存在的接口的限制。


这是一种方法。 霍克,也许,但它的作品...

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,但我发现它通常更清晰,不需要从具体类继承。


这工作形式我,

DecimalFormatSymbols SYMBOLS = DecimalFormatSymbols.getInstance(Locale.US);

    if (value > 1 || value < -1) {
        SYMBOLS.setExponentSeparator("e+");
    } else {
        SYMBOLS.setExponentSeparator("e");
    }

    DecimalFormat format = new DecimalFormat(sb.toString(), SYMBOLS);

你可以使用printf()来代替:

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

输出:

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

如果您需要输出为String ,则可以使用Formatted Printing for Java(sprintf)中提供的信息来执行此操作。

编辑:哇, PrintfFormat()东西是巨大的,似乎是不必要的:

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

我从Get an OutputStream获得了上述代码的想法。

链接地址: http://www.djcxy.com/p/78445.html

上一篇: Java DecimalFormat Scientific Notation Question

下一篇: Is there an easy way to encrypt a java object?