【问题标题】:DecimalFormat not giving expected format (Indian Number System)DecimalFormat 未给出预期格式(印度数字系统)
【发布时间】:2013-11-26 15:18:38
【问题描述】:

这里是代码。

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

【问题讨论】:

  • 除非你想做什么
  • 我没听懂你想说什么!
  • 我是 Java 新手,但想提出建议。您是否查看过使用诸如“en_IN”(用于印度)之类的区域设置,并查看它是否以您想要的方式格式化数字。这里有一个示例:docs.oracle.com/javase/7/docs/api/java/text/… - 在页面上继续搜索此字符串“// 使用本地化数字、整数、货币打印出一个数字”。
  • 嗯,我已经尝试过使用 en_IN 和 hi_IN 的语言环境。它还提供具有相同分组大小的相同输出。
  • @Akshat 阅读了这个 java 文档,我认为你理解得更好docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

标签: java decimalformat


【解决方案1】:

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

来自 Javadoc:

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

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

【讨论】:

  • 那么,如何实现这个模式呢?
  • 如果是单纯的整数,基本的Substring就够了:codeint number = 10000000; DecimalFormat df = new DecimalFormat("#,##,##"); System.out.println(df.format(number/10)+number%10); code
【解决方案2】:

按预期工作。来自 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}, ',')

【讨论】:

【解决方案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

【讨论】:

    【解决方案4】:

    我想到的一件事是:

    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
    

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

    【讨论】:

    • 嗯,但迭代必须从数字左侧的个位开始。因为,数字可以小(1,000)或大(1,23,45,67,890)。好的,我试试看。
    • 第二种情况下的数字是1234567890.0还是1234567.890?在任何情况下,与其从头开始迭代并让逗号从头到尾,不如倒转这个过程。
    【解决方案5】:

    JDK 的 DecimalFormat 不支持二次分组;重症监护室:

    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 的 DecimalFormatjavadoc:http://icu-project.org/apiref/icu4j/com/ibm/icu/text/DecimalFormat.html 上查看完整的详细信息

    【讨论】:

      猜你喜欢
      • 2014-09-24
      • 2019-04-17
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 2018-11-29
      • 2020-09-09
      相关资源
      最近更新 更多