去除BigDecimal类型数字的前导零和分隔符字符

4

我们的应用程序可以获取以下数字:

0.1
0.02
0.003

这些值在我们的代码中被视为 BigDecimal,因为我们处理货币。

在 Web UI 上有一个表单,用户应该查看这些价格的浮动部分,转换为以下形式:

1
02
003

问题是如何在输入价格中修剪前导零和分隔符。也许BigDecimal类有类似于trimLeadingZeroes()的标准方法,但找不到任何信息。
更新: 仅修剪前导零和分隔符。
例如:
1 is 0.1

27 is 0.27

我不确定我理解这些要求。在显示这些数字时,0.02和0.0002之间有什么区别? - Aleks G
2
你想把0.1、0.01和0.001看作是相同的吗? - Jon Skeet
1
这些不是真正的前导零,它们传达了意义。 - Randy
抱歉出现错误,我已经更新了帖子。 - sergionni
@Jon Skeet:我已经更新了帖子,对于错误感到抱歉:0.1是1;0.01是01,0.001是001。 - sergionni
显示剩余2条评论
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"; 
}

1

BigDecimalString 的转换:

    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”。

这是您想要的转换吗?


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将返回""。


1

您可以使用value(一个BigDecimal)的字符串表示和StringUtils.substringAfter来实现此操作:

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

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

1
无论何时您需要处理分割某些内容时,使用字符串是一个不错的选择。
首先,您只需将BigDecimal转换为字符串。
String s=bd.toPlainString();

然后你只需要这样分割它

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

现在字符串 s2 包含了分隔符后面的数字。


1

你尝试过调用BigDecimal.unscaledValue吗?缺点是0.13将变成13,而你可能想要1.3...这有点难以确定。如果你能提供更多的例子,那会真的很有帮助。

(如果值一开始就是1000,这种方法也会失败 - 你最终会得到1...)


使用 unscaledValue() 存在以下问题:0.01 -> 11.01 -> 101 - Marsellus Wallace
@sergionni:不,我是指链接中的BigDecimal.unscaledValue。 - Jon Skeet
1
@Gevorg:是的,不幸的是,我们基本上没有足够的信息来了解各种值应该变成什么... - Jon Skeet

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

    }
}

0

写一个扩展方法来扩展这个类型,简单的方法可以将数字乘以直到 > 1。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接