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)
如果你真的需要正确的方法,那么你可以使用谷歌最近开源的libphonenumber
您也可以使用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
最糟糕的解决方案是:
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)
这就是我最终做到的方式:
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个字符长的电话号码.我只是想用一些格式打印它.
谢谢你的回复.