如何在Android编辑字段中格式化字符串号以使其带有逗号


76

我可以在android中使用什么功能将数字显示为不同的格式。

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

请指导我。

Answers:


159

您可以使用数字DecimalFormat并设置其格式

DecimalFormat formatter = new DecimalFormat("#,###,###");
String yourFormattedString = formatter.format(100000);

结果将是

  • 1,000,000 为1000000
  • 10,000 为10000
  • 1,000 为1000

更新12/02/2019

String.format("%,d", number)如@DreaminginCode在下面的注释中所示,这将是一个更好的(较少硬编码)解决方案,因此我想我将在此处添加它作为替代方案


但是,如果我输入100000,则显示100,000,而我需要这样的1,00,000,这可能吗?
user1082964

5
你为什么想这么做?100,000是标准。尝试以#,##,###这样的哈希格式移动逗号。不知道它是否可以工作,但是您可以尝试一下。
the-ginger-geek

3
@Neil,该标准仅对特定国家有效。例如,印度的标准不同,格式为#,##,###
网上诱骗

7
它可以回答问题,但回答问题并不会自动使其成为一个很好的答案。而且,当信息不足时,我相信作为程序员的人应该承担更少而不是承担更多责任。当假设发生变化时,使用硬编码的答案很容易中断,在这种情况下,硬编码对任何与i18n相关的代码尤其不利,因为将来总会有人尝试添加i18n,这将是他们的工作时刻。更不用说甚至更多的数字都可以打破这一点。对于一个更简单的解决方案,你也可以使用String.format("%,d", number)这是短期和正确的
张海

1
我可以在小数点后加上1,000,000.50吗?还是1M.50?@Neil
Leon Zaii '18

44

尝试这一希望它会有所帮助。

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

4
为了安全起见,您可能需要使用设备的语言环境,而不总是使用美国。当前的语言环境= getResources()。getConfiguration()。locale;
马特

5
Locale.getDefault()是获取设备区域设置的一种甚至更简单的方法。
Gober 2015年

3
根据Java文档,无参数get...Instance()方法默认情况下使用默认语言环境。
Juan De la Cruz

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

6
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");

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

您可以使用Numberformat

public static double getNumberByString(String s) throws ParseException {
    return NumberFormat.getInstance(Locale.getDefault()).parse(s).doubleValue();
}

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));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.