0

大きな数字をフォーマットするこの関数があります。

public static String ToEngineeringNotation(Double d, String unit, int decimals) {
        double exponent = Math.log10(Math.abs(d));
        if (d != 0)
        {
            String result = "0";
            switch ((int)Math.floor(exponent))
            {
                case -2: case -1: case 0: case 1: case 2:
                    result = (d + "").replace(".", ",") + " " + unit;
                    break;
                case 3: case 4: case 5:
                    result = ((d / 1e3) + "").replace(".", ",") + " k" + unit;
                    break;
                case 6: case 7: case 8:
                    result = ((d / 1e6) + "").replace(".", ",") + " M" + unit;
                    break;
                default:
                    result = ((d / 1e9) + "").replace(".", ",") + " G" + unit;
                    break;
            }

            if (result.contains(",")) {
                if (result.indexOf(" ") - result.indexOf(",") >= decimals) {
                    result = result.substring(0, result.indexOf(",") + decimals + 1) + result.substring(result.indexOf(" "));
                }
                if (decimals <= 0)
                    result = result.replace(",", "");
            }
            return result;
        } else {
            return "0 " + unit;
        }
    }

3866500.0I want to getを与えると3.9 M、代わりに is を取得3,8 Mします。これは、アルゴリズムが最も近い上限値に丸められないためです。どうすればいいのかわかりません。

何か案が ?

4

3 に答える 3

1

ああ、問題は、文字列にした後に小数を削除していることです。別の方法で行う方が簡単です。つまり、次のようになります。

case 6: case 7: case 8:
    double divide = (d / 1e6d) * ;
    double roundFactor = Math.pow(10, decimals);
    result = (Math.round(divide * roundFactor) / roundFactor) + "").replace(".", ",") + " M" + unit;
    break;

これは最もクリーンな方法ではありませんが、アイデアをお見せしたいと思います。文字列ではなく、数学で丸めます。

于 2012-11-17T05:14:20.007 に答える
1

データを java.math.BigDecimal に変換することをお勧めします。正の無限大への丸めなど、いくつかの丸めモードがあります。10 進数の表現から始めると、書式設定が簡単になると思います。

于 2012-11-17T05:17:39.077 に答える
1

java.text.NumberFormat をお勧めします:

public static String ToEngineeringNotation(double d, String unit, int decimals) {
    String m = "";
    if (d > 1000000000) {
        d = d / 1000000000;
        m = " G";
    } else if (d > 1000000) {
        d = d / 1000000;
        m = " M";
    } else  if (d > 1000) {
        d = d / 1000;
        m = " K";
    }
    NumberFormat f = NumberFormat.getInstance();
    f.setGroupingUsed(false);
    f.setMinimumFractionDigits(decimals);
    f.setMaximumFractionDigits(decimals);
    return f.format(d) + m + " " + unit;
}

NumberFormat は、ロケールに応じて小数点記号を選択することに注意してください。これはおそらく必要なものです。常にカンマにしたい場合は、 NumberFormat.getInstance(Locale.GERMAN) を使用してください

于 2012-11-17T06:45:30.673 に答える