【问题标题】:How can I format a String number to have commas in android Edit Field如何格式化字符串数字以在 android 编辑字段中使用逗号
【发布时间】:2013-11-16 06:36:24
【问题描述】:

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

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

请指导我。

【问题讨论】:

    标签: java android string format


    【解决方案1】:

    您可以使用DecimalFormat 并格式化数字

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

    结果将是

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

    2019 年 12 月 2 日更新

    这个String.format("%,d", number) 将是一个更好(更少硬编码)的解决方案,正如@DreaminginCode 在下面的 cmets 中所指出的那样,所以我想我会在此处添加它作为替代方案

    【讨论】:

    • 但是如果我输入 100000 它显示 100,000 而我需要这样的 1,00,000,这可能吗?
    • 您为什么要这样做? 100,000 是标准的。尝试以 #,##,### 的哈希格式移动逗号。不知道能不能用,你可以试试看。
    • @Neil,该标准仅对特定国家有效。例如,印度有不同的标准,格式为#,##,###
    • 它回答了问题,但回答问题并不会自动使其成为一个好的答案。当信息不足时,我相信作为程序员的人应该少假设而不是多假设。当假设发生变化时,使用硬编码的答案很容易被打破,在这种情况下,硬编码对于任何与 i18n 相关的代码都特别不利,因为将来总会有人尝试添加 i18n,这将是他们的 wtf 时刻。更不用说即使是更大的数字也可以打破这一点。对于更简单的解决方案,您可以使用简短而正确的String.format("%,d", number)
    • 我可以在 1,000,000.50 之后添加小数吗?还是 1M.50 ? @尼尔
    【解决方案2】:

    试试这个希望它会有所帮助。

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

    【讨论】:

    • 为了安全起见,您可能希望使用设备的区域设置,而不是始终使用美国。当前语言环境 = getResources().getConfiguration().locale;
    • Locale.getDefault() 是获取设备区域设置的更简单方法。
    • 根据Java Documentation,无参数get...Instance()方法默认使用默认语言环境。
    【解决方案3】:
    private String getFormatedAmount(int amount){
      return NumberFormat.getNumberInstance(Locale.US).format(amount);
    }
    

    【讨论】:

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

      【讨论】:

        【解决方案5】:

        在普通类中添加这个函数

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

        【讨论】:

          【解决方案6】:

          添加如下文本更改监听器(同时确保为 Edittext 选择的输入类型是数字):

          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
          
                  }
              });
          

          【讨论】:

            【解决方案7】:

            你可以使用数字格式

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

            【讨论】:

              【解决方案8】:
              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));
              }
              

              【讨论】:

                【解决方案9】:

                我写的这个 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()
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-10-24
                  • 2011-09-19
                  • 2010-10-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-04
                  相关资源
                  最近更新 更多