【问题标题】:android: how do I format number as phone with parenthesesandroid:如何将数字格式化为带括号的电话
【发布时间】:2014-02-11 18:55:06
【问题描述】:

我有一个需要格式化为电话号码的号码。如果我这样做了

 PhoneNumberUtils.formatNumber(numStr);

然后我得到

888-555-1234

但我需要得到的是

(888) 555-1234

如何获得第二个?有标准的android方式吗?

【问题讨论】:

  • 您只针对北美号码吗?

标签: android phone-number number-formatting libphonenumber


【解决方案1】:

如果你有字符串 "888-555-1234" - 使用 PhoneNumberUtils.formatNumber(numStr); 你可以简单地这样做:

String numStr = "888-555-1234";

numStr = "(" + numStr.substring(0,3) + ") " + numStr.substring(4);

System.out.print(numStr); // (888) 555-1234

但是,这是硬编码的。在执行此操作之前,您需要确保字符串包含完整的 10 位数字。

【讨论】:

    【解决方案2】:

    如果你知道你想为哪个国家做这件事,你可以使用谷歌的开源库libphonenumber。以下是如何格式化它:

    String numberStr = "8885551234"
    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
    try {
      PhoneNumber numberProto = phoneUtil.parse(numberStr, "US");
      //Since you know the country you can format it as follows:
      System.out.println(phoneUtil.format(numberProto, PhoneNumberFormat.NATIONAL));
    } catch (NumberParseException e) {
      System.err.println("NumberParseException was thrown: " + e.toString());
    }
    

    如果您不知道国家/地区,那么对于 numberStr,请使用 E.164 format phone number,并使用 null 代替国家/地区代码。

    【讨论】:

      【解决方案3】:

      不知道你是否找到了你要找的东西,但我最终写了一个小方法,它需要一个字符串的长度(因为我得到的电话号码来自网络服务,可以是多种格式)。我相信它应该可以工作(到目前为止,我所有的测试用例都使用前两个选项——还没有测试其他两个)。

      public static String FormatStringAsPhoneNumber(String input) {
          String output;
          switch (input.length()) {
              case 7:
                  output = String.format("%s-%s", input.substring(0,3), input.substring(3,7));
                  break;
              case 10:
                  output = String.format("(%s) %s-%s", input.substring(0,3), input.substring(3,6), input.substring(6,10));
                  break;
              case 11:
                  output = String.format("%s (%s) %s-%s", input.substring(0,1) ,input.substring(1,4), input.substring(4,7), input.substring(7,11));
                  break;
              case 12:
                  output = String.format("+%s (%s) %s-%s", input.substring(0,2) ,input.substring(2,5), input.substring(5,8), input.substring(8,12));
                  break;
              default:
                  return null;
          }
          return output;
      }
      

      【讨论】:

        【解决方案4】:

        你只需使用它并得到你想要的:

        new PhoneNumberFormattingTextWatcher()
        

        或者看看这个网址:

        http://developer.android.com/reference/android/telephony/PhoneNumberFormattingTextWatcher.html

        【讨论】:

          【解决方案5】:

          尝试使用正则表达式。 This 会帮助你。至于我,我用这个:

                                  var result = "+1 888-555-1234"
          
          
                                  if (Pattern.compile("^\\+[\\d]+\\s[\\d]{1,3}\\s[\\d]+").matcher(result).find()) {
                                      result = result.replaceFirst(" ", "(").replaceFirst(" ", ")").replace(" ","-")
                                  }
          
                                  if(Pattern.compile("^\\+[\\d]+\\s[\\d]{1,3}-[\\d]+").matcher(result).find()){
                                      result = result.replaceFirst(" ", "(").replaceFirst("-", ")")
                                  }
                                  Timber.d("$result")
          

          输出:+1(888)555-1234

          【讨论】:

            【解决方案6】:

            2020 年可行的解决方案:

            TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            
            String countryIso = telephonyManager.getNetworkCountryIso().toUpperCase();
            
            phoneNumberTextView.setText(PhoneNumberUtils.formatNumber("3473214567", countryIso));
            

            【讨论】:

              猜你喜欢
              • 2015-07-25
              • 1970-01-01
              • 1970-01-01
              • 2023-04-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-04
              • 2010-09-16
              相关资源
              最近更新 更多