6

Java のDecimalFormatクラスを使用して、数値を Scientific Notation で出力しています。ただし、問題が 1 つあります。値に関係なく、文字列を固定長にする必要があります。現在、これは私のフォーマットがどのように見えるかです:

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をサブクラス化する必要があると思います。

4

5 に答える 5

6

これは私から働きました、

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);
于 2012-10-25T09:25:45.437 に答える
3

代わりに使用できますか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());

上記のコードのアイデアは、Get an OutputStream into a Stringから得ました。

于 2009-07-31T17:30:04.647 に答える
2

これが1つの方法です。ホーキーかもしれませんが、うまくいきます...

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 をサブクラス化することもできますが、具体的なクラスからサブクラス化しない方が一般的にはクリーンであることがわかります。

于 2009-07-31T17:42:58.003 に答える