DecimalFormat没有给出预期的格式(印度数字系统)

时间:2013-11-26 15:18:39

标签: java decimalformat

这是代码。

public class Sample {
    public static void main(String[] args) {
        double number = 10000000;

        DecimalFormat df = new DecimalFormat("#,##,##,###");
        System.out.println(df.format(number));
    }
}

我得到了以下输出。

10,000,000

但是,我想要这样。

1,00,00,000

5 个答案:

答案 0 :(得分:1)

DecimalFormat不使用该模式,分组大小是常量,在您的情况下为3。

来自Javadoc:

  

分组大小是分组字符之间的固定位数,例如3表示100,000,000或4表示1,0000,0000。   如果您提供具有多个分组字符的模式,则   最后一个和整数结束之间的间隔是一个   那是用的。所以“#,##,###,####”==“######,####”==“##,####,####”。

http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

答案 1 :(得分:1)

按预期工作。来自javadoc:

分组分隔符通常用于数千个,但在某些国家/地区,它可以分离数万个。分组大小是分组字符之间的固定位数,例如3表示100,000,000或4表示1,0000,0000。如果提供具有多个分组字符的模式,则最后一个与整数结尾之间的间隔是使用的间隔。所以“#,##,###,####”==“######,####”==“##,####,####”。

可能的丑陋且容易出错的解决方案:

private static String customFormat(double number, int[] patterns, char devider) {
    DecimalFormat df = new DecimalFormat("#.#");
    String nString = new StringBuilder().append(df.format(number)).reverse().toString();
    int position = 0;
    for (int i = patterns.length - 1; i >= 0 ; i--) {
        nString = nString.substring(0, position + patterns[i]) + devider + nString.substring(position + patterns[i]);
        position += (patterns[i] + 1);
    }

    return new StringBuilder(nString).reverse().toString();
}

致电:customFormat(100000000, new int[]{2,2,3}, ',')

答案 2 :(得分:0)

我想到的一件事是:

Make a set of positions on which you want to insert your comma after. For your case, (0, 2, 4).  
Create new StringBuilder.  
Iterate over characters in a string and add them to string builder.
    Peek the stack with comma positions.
    If you're at that position, pop the number from stack and put comma in string builder.
Append decimal separator to string builder
Append decimal part of the original number

它不是那么快,它可能容易出错,但它是一个开始。

答案 3 :(得分:0)

最后,我做了一些工作。

解析字符串并插入逗号是个不错的主意。 但是,我想,代码会有点长而且脏。

因为,分组大小在DecimalFormat中保持不变。我将两个部分分开,用不同的图案对它们进行格式化并将它们连接起这是代码。

public static String format(double value) {
    if(value < 1000) {
        return format("###.##", value);
    } else {
        double hundreds = value % 1000;
        int other = (int) (value / 1000);
        return format(",##", other) + ',' + format("000.##", hundreds);
    }
}

private static String format(String pattern, Object value) {
    return new DecimalFormat(pattern).format(value);
}

因此,对于以下代码:

System.out.println(format(999));
System.out.println(format(393.12));
System.out.println(format(13920003.67));
System.out.println(format(1.83));

输出将如下:

999
393.12
1,39,20,003.67
1.83

答案 4 :(得分:0)

JDK的DecimalFormat不支持二次分组; ICU:

import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.NumberFormat;
import java.util.Locale;

public class TestIcu {
  public static void main(String[] args) {
    NumberFormat format = DecimalFormat.getInstance(new Locale("en", "IN"));
    System.out.println(format.format(10000000));
  }
}

查看ICU DecimalFormat javadoc的完整详情:http://icu-project.org/apiref/icu4j/com/ibm/icu/text/DecimalFormat.html

相关问题