删除BigDecimal的前导零和分隔符char

时间:2011-09-14 16:04:40

标签: java trim bigdecimal leading-zero

我们的申请可以获得以下数字:

0.1
0.02
0.003

我们的代码将这些值视为BigDecimal,直到我们使用金钱。

在网页用户界面上有表单,用户应该查看价格的这些浮动部分,转换为以下部分:

1
02
003

问题是,如何修改输入价格中的前导zerodelimiter character。也许BigDecimal类的标准方法类似于trimLeadingZeroes(),但找不到任何。

更新 仅修正前导零和分隔符符号

例如:

1 is 0.1

27 is 0.27

9 个答案:

答案 0 :(得分:9)

这样的东西?

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"; 
}

答案 1 :(得分:1)

您是否尝试过调用BigDecimal.unscaledValue?缺点是0.13然后是13而你可能想要1.3 ......这有点难以辨别。如果你能提供更多的例子,那确实会有所帮助。

(如果值为1000,则该方法也将失败 - 您最终得到1 ...)

答案 2 :(得分: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

答案 3 :(得分:1)

当你不得不处理分裂某事时,可以使用字符串。

您首先将bigdecimal转换为字符串

String s=bd.toPlainString();

然后你只需将它拆分为

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

现在String s2包含分隔符后面的数字

答案 4 :(得分: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”。

这是你想要的转换吗?

答案 5 :(得分: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将返回“”

答案 6 :(得分:1)

您可以使用valueBigDecimal)和StringUtils.substringAfter的字符串表示来执行此操作:

StringUtils.substringAfter(value.toPlainString(), ".")

答案 7 :(得分:0)

如何编写扩展方法来扩展此类型。简单的方法可能会乘以数字直到> 1

public int  trimLeadingZeroes(bigint num) {
    while (num < 1)
    {
       num = num * 10;
    }
       return num;
    }

答案 8 :(得分: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);
        }

    }
}