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

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

来自Javadoc:

分组大小是分组字符之间的恒定位数,例如3表示100000000或4表示100000000。如果提供具有多个分组字符的模式最后一个和整数末尾之间的间隔为使用的。所以"#,##,####,####"="######,#####"="##,#####,######"。

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

按预期工作。来自javadoc:

分组分隔符通常用于数千,但在一些国家/地区,它可以分隔10000。分组大小是分组字符之间的恒定位数,例如3表示100000000或4表示100000000。如果提供具有多个分组字符的模式,则最后一个和整数末尾之间的间隔就是所使用的间隔。所以"#,##,####,####"="######,#####"="##,#####,######"。

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

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}, ',')

最后,我做了一些工作。

解析字符串并插入逗号是个好主意。但是,我想,代码会有点长;肮脏的

如同,分组大小在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

我脑海中浮现的一件事是:

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

它没有那么快,可能很容易出错,但这只是一个开始。

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

相关内容

  • 没有找到相关文章

最新更新