如何在Java中将电话号码格式化为字符串?

sty*_*fle 27 java string number-formatting

我一直在存储电话号码,我想在将电话号码打印成字符串时添加连字符.

我尝试使用DecimalFormat但不喜欢连字符.可能是因为它用于格式化十进制数而不是长数.

long phoneFmt = 123456789L;
DecimalFormat phoneFmt = new DecimalFormat("###-###-####");
System.out.println(phoneFmt.format(phoneNum)); //doesn't work as I had hoped
Run Code Online (Sandbox Code Playgroud)

理想情况下,我也希望在区号上加上括号.

new DecimalFormat("(###)-###-####");
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

小智 42

你可以使用String.replaceFirst和regex方法一样

    long phoneNum = 123456789L;
    System.out.println(String.valueOf(phoneNum).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1)-$2-$3"));
Run Code Online (Sandbox Code Playgroud)


Tom*_*ros 25

要获得所需的输出:

long phoneFmt = 123456789L;
//get a 12 digits String, filling with left '0' (on the prefix)   
DecimalFormat phoneDecimalFmt = new DecimalFormat("0000000000");
String phoneRawString= phoneDecimalFmt.format(phoneFmt);

java.text.MessageFormat phoneMsgFmt=new java.text.MessageFormat("({0})-{1}-{2}");
    //suposing a grouping of 3-3-4
String[] phoneNumArr={phoneRawString.substring(0, 3),
          phoneRawString.substring(3,6),
          phoneRawString.substring(6)};

System.out.println(phoneMsgFmt.format(phoneNumArr));
Run Code Online (Sandbox Code Playgroud)

控制台的结果如下所示:

(012)-345-6789

要存储电话号码,您应该考虑使用数字以外的数据类型.


小智 16

最简单的方法是使用javax.swing.text库中内置的MaskFormatter .

你可以这样做:

import javax.swing.text.MaskFormatter;

String phoneMask= "###-###-####";
String phoneNumber= "123423452345";

MaskFormatter maskFormatter= new MaskFormatter(phoneMask);
maskFormatter.setValueContainsLiteralCharacters(false);
maskFormatter.valueToString(phoneNumber) ;
Run Code Online (Sandbox Code Playgroud)


Ara*_*ram 8

如果你真的需要正确的方法,那么你可以使用谷歌最近开源的libphonenumber

  • @styfle:单独格式化不是你的问题,将一个phonenumber存储在`long`中. (5认同)
  • 我认为不需要另一个图书馆.必须有一种简单的方法来使用所有不同的Java格式化API.我只是不知道使用哪一个. (3认同)

Ond*_*sky 7

您也可以使用https://github.com/googlei18n/libphonenumber。下面是一个例子:

import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber;

String s = "18005551234";
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
Phonenumber.PhoneNumber phoneNumber = phoneUtil.parse(s, Locale.US.getCountry());
String formatted = phoneUtil.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.NATIONAL);
Run Code Online (Sandbox Code Playgroud)

您可以在此处获取类路径中的库:http : //mvnrepository.com/artifact/com.googlecode.libphonenumber/libphonenumber


Van*_*nya 5

最糟糕的解决方案是:

StringBuilder sb = new StringBuilder();
long tmp = phoneFmt;
sb.append("(");
sb.append(tmp / 10000000);
tmp = tmp % 10000000;
sb.append(")-");
sb.apppend(tmp / 10000);
tmp = tmp % 10000000;
sb.append("-");
sb.append(tmp);
Run Code Online (Sandbox Code Playgroud)

  • 我怀疑这是**最糟糕的** - 开发人员可以非常有创意[:-) (2认同)

sty*_*fle 5

这就是我最终做到的方式:

private String printPhone(Long phoneNum) {
    StringBuilder sb = new StringBuilder(15);
    StringBuilder temp = new StringBuilder(phoneNum.toString());

    while (temp.length() < 10)
        temp.insert(0, "0");

    char[] chars = temp.toString().toCharArray();

    sb.append("(");
    for (int i = 0; i < chars.length; i++) {
        if (i == 3)
            sb.append(") ");
        else if (i == 6)
            sb.append("-");
        sb.append(chars[i]);
    }

    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

我知道这不支持国际号码,但我不是在写一个"真正的"应用程序,所以我并不关心这一点.我只接受10个字符长的电话号码.我只是想用一些格式打印它.

谢谢你的回复.