4

私たちのアプリケーションは次の番号を取得できます。

0.1
0.02
0.003

これらの値は、私たちBigDecimalがお金で運営している限り、私たちのコードによって扱われます。

Web UIにはフォームがあり、ユーザーは価格のこれらの変動部分を次のように表示する必要があります。

1
02
003

zero問題は、先行価格とdelimiter character投入価格をどのように調整するかです。おそらくBigDecimal、クラスにはtrimLeadingZeroes()のような標準メソッドがありますが、何も見つかりません。

更新: 先行ゼロと区切り記号だけをトリミング

例えば:

1 is 0.1

27 is 0.27
4

9 に答える 9

10

このようなもの?

public String getDecimalFractions(BigDecimal value) {
    String strValue = value.toPlainString();
    int index = strValue.indexOf(".");
    if(index != -1) {
        return strValue.substring(index+1, strValue.length());
    } 
    return "0"; 
}
于 2011-09-19T15:36:52.983 に答える
1

電話してみましたBigDecimal.unscaledValueか?欠点は、0.13が13になるのに対し、1.3が必要になる可能性があることです...わかりにくいです。もっと例を挙げていただければ、それは本当に役に立ちます。

(最初に値が1000の場合も、このアプローチは失敗します。最終的には1になります...)

于 2011-09-14T16:11:01.330 に答える
1

これを行うのと同じくらい簡単なことでしょうか?

public static BigDecimal fix(String str){
    return  new BigDecimal("0." + str);
}

だからあなたが作るなら

public static void main(String[] args) {
    System.out.println(fix("1"));
    System.out.println(fix("02"));
    System.out.println(fix("003"));
}

印刷されます

0.1
0.02
0.003
于 2011-09-19T21:28:05.580 に答える
1

何かを分割することに対処しなければならないときはいつでも、その良い賭けの文字列を使用することができます。

まず、bigdecimalを文字列に変換します

String s=bd.toPlainString();

次に、それをそのように分割します

String s2=s.split("\\.")[1];

現在、文字列s2には、区切り文字の後の数字が含まれています

于 2011-09-20T06:44:36.603 に答える
1

BigDecimalからへの変換String

    import java.math.BigDecimal;
    public class XXX {
        public static void main(String[] args){
            doIt("123");
            doIt("123.1");
            doIt("123.01");
            doIt("123.0123");
            doIt("123.00123");
        }
        static void doIt(String input){
            BigDecimal bdIn = new BigDecimal(input);
            System.out.println(bdIn+" -> "+convert(bdIn));
        }
        static String convert(BigDecimal bdIn) {
            BigDecimal bdOut = bdIn.subtract(bdIn.setScale(0, BigDecimal.ROUND_DOWN));
            return bdOut.signum() == 0 ? "0" : bdOut.toPlainString().substring(2);
        }
    }

結果は次のとおりです。

    123 -> 0
    123.1 -> 1
    123.01 -> 01
    123.0123 -> 0123
    123.00123 -> 00123

コードは任意の数で直接機能し、小数部分のみを考慮します。また、「0.0」を適切に処理します。

これはあなたが望んでいた変換ですか?

于 2011-09-20T21:54:56.780 に答える
1

これを行う別の簡単な方法は次のとおりです-入力が1.023456であると仮定します

        BigDecimal bd = new BigDecimal("1.023456");
        BigInteger bi = bd.toBigInteger();
        BigDecimal bd2 = bd.subtract(new BigDecimal(bi));
        String afterDecimalPoint = bd2.scale() > 0 ?
               bd2.toString().substring(2) : "";

これにより、bd3で探していたとおりの正確な結果が得られます。つまり、上記の例では023456になります。

最後の行の条件により、整数でも問題なく機能します。つまり、1は「」を返します。

于 2011-09-23T09:46:56.057 に答える
1

これを行うには、 value(a BigDecimal)とStringUtils.substringAfterの文字列表現を使用できます。

StringUtils.substringAfter(value.toPlainString(), ".")
于 2011-09-23T23:49:19.757 に答える
0

この型を拡張する拡張メソッドを書いてみませんか。単純な方法では、1を超えるまで数値を乗算する場合があります

public int  trimLeadingZeroes(bigint num) {
    while (num < 1)
    {
       num = num * 10;
    }
       return num;
    }
于 2011-09-14T16:09:58.100 に答える
0
import java.math.BigDecimal;
import java.math.RoundingMode;


public class RemoveZeroes {

    static final int SCALE = 10;    // decimal range 0.1 ... 0.0000000001
    static final String PADDING = "0000000000"; // SCALE number of zeroes

    public static void main(String [] arg) {

        BigDecimal [] testArray = {
            new BigDecimal(0.27),
            new BigDecimal(0.1),
            new BigDecimal(0.02),
            new BigDecimal(0.003),
            new BigDecimal(0.0000000001),
        };

        for (int i = 0; i < testArray.length; i++) {
            // normalize to the same scale
            BigDecimal b = testArray[i].setScale(SCALE, RoundingMode.FLOOR);
            // pad on the left with SCALE number of zeroes
            String step1 = PADDING + b.unscaledValue().toString();
            // remove extra zeroes from the left
            String step2 = step1.substring(step1.length() - SCALE);
            // remove extra zeroes from the right
            String step3 = step2.replaceAll("0+$", "");
            // print result
            System.out.println(step3);
        }

    }
}
于 2011-09-21T19:07:54.833 に答える