格式以自定义格式接收长数字作为小数

时间:2015-02-18 16:15:30

标签: java

我收到一个格式化的号码。虽然我现在收到这个号码,但我现在最后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的格式化程序并按照我想要的方式格式化数字。

2 个答案:

答案 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然后使用不同的分组重新格式化更好。