我想更改以下输出
5250.000000000000
5512.500000000000
5788.125000000001
6077.531250000001
6381.407812500002
6700.478203125002
7035.502113281253
7387.277218945315
7756.641079892581
8144.47313388721
到以下输出。
5250.0
5512.5
5788.125
6077.53125
6381.4078125
6700.478203125
7035.50211328125
7387.277218945313
7756.641079892578
8144.473133887207
所以看起来我需要的逻辑是,如果小数位的重复0
少于两个,则只打印小数位。我假设printf可以处理这个,但如果我真的知道,我不会问。
答案 0 :(得分:2)
要么我误读了这个问题,要么在我打字时它发生了变化,我的原始答案暗示DecimalFormat不会做你想要的。正则表达式将:
final String unformatted = Double.toString(6381.407812500002);
final String formatted = unformatted.replaceAll("00+\\d*$", "");
System.out.println(formatted);
收益率:6381.4078125
您要求替换两个以上的零和所有数字,因此匹配00
后跟任何数字(与.
不匹配所以这只会在小数点后修剪放置并删除它。
原始答案:
几乎所有数字格式需求的答案都是DecimalFormat(javadoc)。特别针对这种情况:
NumberFormat formatter = new DecimalFormat("0.###########");
System.out.println(formatter.format(5788.125000000001));
收益率:5788.125
在这种情况下,我指定了最多11位小数,除了它将被舍入,并使用#
(而不是小数点后的0
)告诉它不显示尾随在那个位置0。
答案 1 :(得分:1)
一种方法是构造一个regex
,它将从给定的字符串中删除不需要的尾随零。像下面这样的东西会为你做。只需将此正则表达式放在正在读取文件的循环中。
// The 1-9 group would erase the last trailing
// non-zero digit, as suggested by the example
somevariable = str.replaceAll("0+[1-9]?$", "");
答案 2 :(得分:1)
这是你如何做到的。我正在使用double,但你也可以做同样的浮动。
double doubleValue = 1001.10210010138200321;
String doubleString = Double.toString(doubleValue);
String[] part = doubleString.split("\\.");
String decimalPart = part[1].substring(0, part[1].indexOf("00"));
String trimmedDoubleString = part[0] + "." + decimalPart;
double trimmedDouble = Double.parseDouble(trimmedDoubleString);