我们的应用程序可以获取以下数字:
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
1 is 0.1
27 is 0.27
像这样的吗?
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";
}
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”。
这是您想要的转换吗?
这里有另一种简单的方法——假设您的输入为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将返回""。
您可以使用value
(一个BigDecimal
)的字符串表示和StringUtils.substringAfter来实现此操作:
StringUtils.substringAfter(value.toPlainString(), ".")
这可能只是做这个简单的事情吗:
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
String s=bd.toPlainString();
然后你只需要这样分割它
String s2=s.split("\\.")[1];
现在字符串 s2 包含了分隔符后面的数字。
你尝试过调用BigDecimal.unscaledValue
吗?缺点是0.13将变成13,而你可能想要1.3...这有点难以确定。如果你能提供更多的例子,那会真的很有帮助。
(如果值一开始就是1000,这种方法也会失败 - 你最终会得到1...)
unscaledValue()
存在以下问题:0.01 -> 1
和 1.01 -> 101
。 - Marsellus Wallaceimport 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);
}
}
}
写一个扩展方法来扩展这个类型,简单的方法可以将数字乘以直到 > 1。
public int trimLeadingZeroes(bigint num) {
while (num < 1)
{
num = num * 10;
}
return num;
}