使用自定义格式将收到的长数字格式设置为十进制的十进制格式

法沃拉斯

我收到的电话号码格式正确。尽管我已经很长时间收到了这个数字,但我现在的最后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));

我想知道是否可以在不使用该强制转换的情况下实现此目标,也就是说,设置一个接收a的格式化程序long并以所需的方式格式化数字。

阿德里安·莱昂哈德(Adrian Leonhard)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章