如何在Android编辑框中将字符串数字格式化为带有逗号的形式

88

在Android中,我可以使用哪个函数将数字显示为不同的格式。

例如: 如果我输入1000,则应显示为1,000。 如果我输入10000,则应显示为10,000。 如果我输入1000000,则应显示为1,000,000。

请指导我。

10个回答

181

你可以使用 DecimalFormat 类来格式化数字。

DecimalFormat formatter = new DecimalFormat("#,###,###");
String yourFormattedString = formatter.format(100000);
结果将会是:
  • 1,000,000 表示 1000000
  • 10,000 表示 10000
  • 1,000 表示 1000

更新于2019年12月02日

如下所述,这个String.format("%,d", number)会是更好(不太硬编码)的解决方案,由@DreaminginCode在下面的评论中指出,因此我想在这里作为另一种选择添加它。


但是如果我输入100000,它会显示为100,000,而我需要像这样的1,00,000,这可能吗? - user1082964
6
为什么你想这么做?10万是标准的。尝试将哈希格式中的逗号移动,像这样#,##,###。不知道是否有效,但你可以试一试。 - the-ginger-geek
6
@Neil,这个标准只适用于特定的国家。例如,印度有不同的标准,格式为#,##,###。 - gonephishing
7
回答问题不等于自动成为好答案,当信息不足时,我认为作为程序员应该假设较少而非较多。使用硬编码的答案会在假设改变时容易出错,在涉及国际化相关代码时更是如此,因为未来可能会有其他人尝试添加国际化,这将导致他们感到困惑和不解。更不用说,即使只是一个更大的数字也可能会导致错误。要得到一个更简单的解决方案,您可以使用 String.format("%,d", number),它既简短又正确。 - Hai Zhang
1
我可以在数字后面添加小数点,例如1,000,000.50吗?或者是1M.50?@Neil - Leon Zaii
显示剩余2条评论

51

试一下这个,希望能有所帮助。

 System.out.println(NumberFormat.getNumberInstance(Locale.US).format(1000));

4
为了安全起见,您可能希望使用设备的语言环境,而不总是使用美国语言环境。获取当前语言环境的代码为:getResources().getConfiguration().locale; - Matt
7
Locale.getDefault() 是获取设备语言环境的更加简便的方法。 - Gober
4
根据Java文档,无参的get...Instance()方法默认使用默认语言环境。 - Juan De la Cruz

15
private String getFormatedAmount(int amount){
  return NumberFormat.getNumberInstance(Locale.US).format(amount);
}

9
int[] numbersToFormat = new int[]
  { 1, 10, 100, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };


for (int number : numbersToFormat) {
  System.out.println(  
    NumberFormat.getNumberInstance(Locale.getDefault()).format(number));
}

输出

1
10
100
10,000
100,000
1,000,000
10,000,000
100,000,000
1,000,000,000

4
将此功能添加到通用类中。
  public static String getFormatedNumber(String number){
        if(!number.isEmpty()) {
            double val = Double.parseDouble(number);
            return NumberFormat.getNumberInstance(Locale.US).format(val);
        }else{
            return "0";
        }
    }

然后在任何地方都可以像这样使用该函数:

String newNumber = Utils.getFormatedNumber("10000000");

3
您可以使用Numberformat。
public static double getNumberByString(String s) throws ParseException {
    return NumberFormat.getInstance(Locale.getDefault()).parse(s).doubleValue();
}

2

请按以下方式添加文本更改监听器(同时确保EditText所选的输入类型为Number):

etTest.addTextChangedListener(new TextWatcher() {

        boolean isManualChange = false;

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            if (isManualChange) {
                isManualChange = false;
                return;
            }

            try {
                String value = s.toString().replace(",", "");
                String reverseValue = new StringBuilder(value).reverse()
                        .toString();
                StringBuilder finalValue = new StringBuilder();
                for (int i = 1; i <= reverseValue.length(); i++) {
                    char val = reverseValue.charAt(i - 1);
                    finalValue.append(val);
                    if (i % 3 == 0 && i != reverseValue.length() && i > 0) {
                        finalValue.append(",");
                    }
                }
                isManualChange = true;
                etTest.setText(finalValue.reverse());
                etTest.setSelection(finalValue.length());
            } catch (Exception e) {
                // Do nothing since not a number
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    });

1

推荐和首选的方法是使用 strings.xml 文件进行操作。

<string name="format_denominated">%,d</string>

从你的 Kotlin/Java 代码中

getResources().getString(R.string.format_denominated, value)

使用数据绑定会更好

<TextView
    android:text="@{@string/format_denominated(value)}"
    ............/>

1
public static String formatNumber(int number){
    return NumberFormat.getNumberInstance(Locale.getDefault()).format(number);
}
public static String formatNumber(String number){
    return NumberFormat.getNumberInstance(Locale.getDefault()).format(Integer.parseInt(number));
}

0
我写了这个 Kotlin 的扩展函数,可能会有帮助。
fun String.formatPoint(): String {
    val sb = StringBuilder()
    this.reversed().forEachIndexed { index, c ->
        // 123,123,123
        if ((index + 1) % 3 == 0) {
            if (index != this.length - 1) {
                sb.append("$c,")
            } else {
                sb.append(c)
            }
        } else {
            sb.append(c)
        }
    }

    return sb.toString().reversed()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接