13

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

 PhoneNumberUtils.formatNumber(numStr);

然后我得到

888-555-1234

但我需要得到的是

(888) 555-1234

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

4

6 回答 6

19

如果你知道你想要做的国家,你可以使用谷歌的开源库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 格式的电话号码并使用 null 代替国家/地区代码。

于 2014-01-21T23:14:14.047 回答
11

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

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;
}
于 2014-03-04T18:14:35.430 回答
4

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

new PhoneNumberFormattingTextWatcher()

或者看看这个网址:

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

于 2015-02-20T06:44:30.433 回答
4

如果你有字符串"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 位数字。

于 2014-01-21T22:54:08.583 回答
0

2020年工作解决方案:

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

String countryIso = telephonyManager.getNetworkCountryIso().toUpperCase();

phoneNumberTextView.setText(PhoneNumberUtils.formatNumber("3473214567", countryIso));
于 2020-06-02T22:33:19.750 回答
0

尝试使用正则表达式。将对您有所帮助。至于我,我用这个:

                        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

于 2018-11-07T00:26:11.633 回答