我收到一个格式化的号码。虽然我现在收到这个号码,但我现在最后3位数对应一个小数部分,所以我想显示用分组和小数分隔符格式化的数字。
示例:如果我收到号码11111111111
,我希望它显示为11 111 111.111
我有这段代码:
DecimalFormat formatter = new DecimalFormat();
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
formatter.setGroupingUsed(true);
symbols.setDecimalSeparator('.');
symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
long valueAsLong = 11111111111L;
double value = (double) valueAsLong / 1000;
System.out.println(formatter.format(valueAsLong));
System.out.println(formatter.format(value));
我想知道我是否可以在没有演员的情况下实现这一点,即设置一个接收long
的格式化程序并按照我想要的方式格式化数字。
答案 0 :(得分:1)
没有DecimalFormat不支持这个,因为它的目的是将数字格式化为String而不改变它的值。
format(longValue / 1000.0)
是最简单的解决方案,但请注意,它不适用于非常大的长片:
public class Test {
public static void main(String[] args) {
DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getInstance(Locale.US);
char decimalSeparator = decimalFormat.getDecimalFormatSymbols().getDecimalSeparator();
// prints 123.456
System.out.println(decimalFormat.format(123456 / 1000.0));
// 9,223,372,036,854,775,807
System.out.println(decimalFormat.format(Long.MAX_VALUE));
// 9,223,372,036,854,776, not 9,223,372,036,854,776.807, as double's resolution is not sufficient
System.out.println(decimalFormat.format(Long.MAX_VALUE / 1000.0));
// 9,223,372,036,854,775.807
BigInteger[] divAndRem = new BigInteger(Long.toString(Long.MAX_VALUE))
.divideAndRemainder(new BigInteger("1000"));
System.out.println(decimalFormat.format(divAndRem[0])
+ decimalSeparator + divAndRem[1]);
// using String manipulation
String longString = decimalFormat.format(Long.MAX_VALUE);
System.out.println(new StringBuilder(longString).replace(
longString.length() - 4,
longString.length() - 3,
Character.toString(decimalSeparator)));
}
}
答案 1 :(得分:0)
您实际上可以在不进行强制转换的情况下执行此操作,但需要使用java.text.DecimalFormat#parse解析"#\u2030"
模式,其中\u2030
是‰
(每个mille)字符。
long myLong = 123456L;
String asPerMille =
new StringBuffer().append(myLong).append('\u2030').toString();
DecimalFormat perMilleFormat = new DecimalFormat("#\u2030");
Number myLongAsDec = perMilleFormat.parse(asPerMille);
System.out.println(
String.format("%d can be parsed with pattern %s as a per-mille and gives %f",
myLong,
perMilleFormat.toPattern(),
myLongAsDec.doubleValue()));
输出结果为:
123456 can be parsed with pattern #‰ as a per-mille and gives 123.456000
请注意,性能方面,您的方法肯定比构建和解析String
然后使用不同的分组重新格式化更好。