Java 删除BigDecimal的前导零和分隔符字符

Java 删除BigDecimal的前导零和分隔符字符,java,trim,bigdecimal,leading-zero,Java,Trim,Bigdecimal,Leading Zero,我们的应用程序可以获得以下数字: 0.1 0.02 0.003 等等 我们的代码将这些值视为BigDecimal,因为我们使用的是货币 web UI上有一个表单,用户应在其中查看价格的这些浮动部分,并将其转换为以下部分: 1 02 003 问题是,如何在输入价格中修剪前导零和分隔符。也许BigDecimal类有类似trimLeadingZeroes()的标准方法,但找不到任何方法 更新: 仅修剪前导零和分隔符符号 例如: 1 is 0.1 27 is 0.27 写一个扩展方法来扩展这个类

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

0.1
0.02
0.003
等等

我们的代码将这些值视为
BigDecimal
,因为我们使用的是货币

web UI上有一个表单,用户应在其中查看价格的这些浮动部分,并将其转换为以下部分:

1
02
003
问题是,如何在输入价格中修剪前导
分隔符
。也许
BigDecimal
类有类似trimLeadingZeroes()的标准方法,但找不到任何方法

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

例如:

1 is 0.1

27 is 0.27

写一个扩展方法来扩展这个类型怎么样。简单的方法可能会将数字相乘,直到>1

public int  trimLeadingZeroes(bigint num) {
    while (num < 1)
    {
       num = num * 10;
    }
       return num;
    }
public int trimLeadingZeroes(bigint num){
while(num<1)
{
num=num*10;
}
返回num;
}
你试过打电话吗?缺点是0.13将是13,而你可能想要1.3。。。这有点难说。如果你能举更多的例子,那会很有帮助

(如果一开始的值是1000,那么这种方法也会失败-最终的结果是1…

类似这样的值

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

可能是这么简单的事情吗:

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

当你需要处理拆分某个东西时,很有可能会用到字符串

首先将bigdecimal转换为字符串

String s=bd.toPlainString();
然后你就这么简单地把它分开

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

现在,字符串s2包含从
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”

这是您想要的转换吗?

import java.math.BigDecimal;
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);
        }

    }
}
导入java.math.RoundingMode; 公共类RemoveZeroes{ 静态最终整数刻度=10;//十进制范围0.1…0.0000000001 静态最终字符串PADDING=“0000000000”//缩放零的数量 公共静态void main(字符串[]arg){ BigDecimal[]测试阵列={ 新的BigDecimal(0.27), 新的BigDecimal(0.1), 新的BigDecimal(0.02), 新的BigDecimal(0.003), 新的BigDecimal(0.0000000001), }; 对于(int i=0;i
这里是另一种简单的方法——假设您的输入是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将返回“”

您可以使用
值的字符串表示形式(a
BigDecimal
)来执行此操作:

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

我不确定我是否理解这些要求。在显示这些数字时,0.02和0.0002之间有什么区别?因此,您希望将0.1、0.01和0.001视为相同?这些不是真正的前导零。。它们传达了意义。是否总是有一个非零的数字,或者0.023是一种可能性?对不起,错了,我更新了positioning
unscaledValue()
有以下问题:
0.01->1
1.01->101
@sergionni:不,我是指bigdecime.unscaledValue,如链接所示。@Gevorg:Yes,不幸的是,我们基本上没有足够的关于各种价值观应该变成什么的信息。。。