Как форматировать номер телефона в виде строки в Java?
Я сохраняю телефонные номера как долговые, и я хотел бы просто добавить дефисы при печати номера телефона в виде строки.
Я попытался использовать DecimalFormat
, но это не похоже на дефис. Вероятно, потому что он предназначен для форматирования десятичных чисел и не longs.
long phoneFmt = 123456789L;
DecimalFormat phoneFmt = new DecimalFormat("###-###-####");
System.out.println(phoneFmt.format(phoneNum)); //doesn't work as I had hoped
В идеале я хотел бы также скопировать код области.
new DecimalFormat("(###)-###-####");
Каков правильный способ сделать это?
Ответы
Ответ 1
Вот как я это сделал:
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();
}
Я понимаю, что это не поддерживает международные номера, но я не пишу "настоящее" приложение, поэтому меня это не беспокоит. Я принимаю только 10 символов в виде номера телефона. Я просто хотел напечатать его с некоторым форматированием.
Спасибо за ответы.
Ответ 2
Вы можете использовать String.replaceFirst с помощью метода regex, например
long phoneNum = 123456789L;
System.out.println(String.valueOf(phoneNum).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1)-$2-$3"));
Ответ 3
Чтобы получить желаемый результат:
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));
Результат в консоли выглядит следующим образом:
(012) -345-6789
Для хранения телефонных номеров вы должны рассмотреть используя тип данных, отличный от номеров.
Ответ 4
Самый простой способ сделать это - использовать встроенный MaskFormatter в библиотеке javax.swing.text.
Вы можете сделать что-то вроде этого:
import javax.swing.text.MaskFormatter;
String phoneMask= "###-###-####";
String phoneNumber= "123423452345";
MaskFormatter maskFormatter= new MaskFormatter(phoneMask);
maskFormatter.setValueContainsLiteralCharacters(false);
maskFormatter.valueToString(phoneNumber) ;
Ответ 5
Если вам действительно нужен правильный путь, вы можете использовать недавно открывшийся Google libphonenumber
Ответ 6
Самое худшее возможное решение:
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);
Ответ 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);
Здесь вы можете получить библиотеку в своем пути к классам: http://mvnrepository.com/artifact/com.googlecode.libphonenumber/libphonenumber
Ответ 8
Вы можете реализовать свой собственный метод для этого, я рекомендую вам использовать что-то вроде этого. Используя DecimalFormat
и MessageFormat
. С помощью этого метода вы можете использовать практически все, что хотите (String,Integer,Float,Double
), и вывод будет всегда правильным.
import java.text.DecimalFormat;
import java.text.MessageFormat;
/**
* Created by Yamil Garcia Hernandez on 25/4/16.
*/
public class test {
// Constants
public static final DecimalFormat phoneFormatD = new DecimalFormat("0000000000");
public static final MessageFormat phoneFormatM = new MessageFormat("({0}) {1}-{2}");
// Example Method on a Main Class
public static void main(String... args) {
try {
System.out.println(formatPhoneNumber("8091231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("18091231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("451231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("11231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("1231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber(""));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber(0));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber(8091231234f));
} catch (Exception e) {
e.printStackTrace();
}
}
// Magic
public static String formatPhoneNumber(Object phone) throws Exception {
double p = 0;
if (phone instanceof String)
p = Double.valueOf((String) phone);
if (phone instanceof Integer)
p = (Integer) phone;
if (phone instanceof Float)
p = (Float) phone;
if (phone instanceof Double)
p = (Double) phone;
if (p == 0 || String.valueOf(p) == "" || String.valueOf(p).length() < 7)
throw new Exception("Paramenter is no valid");
String fot = phoneFormatD.format(p);
String extra = fot.length() > 10 ? fot.substring(0, fot.length() - 10) : "";
fot = fot.length() > 10 ? fot.substring(fot.length() - 10, fot.length()) : fot;
String[] arr = {
(fot.charAt(0) != '0') ? fot.substring(0, 3) : (fot.charAt(1) != '0') ? fot.substring(1, 3) : fot.substring(2, 3),
fot.substring(3, 6),
fot.substring(6)
};
String r = phoneFormatM.format(arr);
r = (r.contains("(0)")) ? r.replace("(0) ", "") : r;
r = (extra != "") ? ("+" + extra + " " + r) : r;
return (r);
}
}
Результат будет
(809) 123-1234
+1 (809) 123-1234
(45) 123-1234
(1) 123-1234
123-1234
023-1234
java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at java.lang.Double.valueOf(Double.java:502)
at test.formatPhoneNumber(test.java:66)
at test.main(test.java:45)
java.lang.Exception: Paramenter is no valid
at test.formatPhoneNumber(test.java:78)
at test.main(test.java:50)
(809) 123-1232
Ответ 9
DecimalFormat
не позволяет форматировать произвольный текст в номере, как префикс или суффикс. Поэтому он не сможет вам помочь.
По моему мнению, полное сохранение номера телефона в виде числового значения является неправильным. Что делать, если я хочу сохранить международный номер? Многие страны используют +
для обозначения кода страны (например, +1
для США /Canda ), другие используют 00
(например, 001
).
Оба из них не могут быть действительно представлены в числовом типе данных ( "Это номер 1555123 или 001555123?" )
Ответ 10
U может форматировать любую строку, содержащую нецифровые символы, также в желаемый формат, используя мой класс util для форматирования
использование очень просто
public static void main(String[] args){
String num = "ab12345*&67890";
System.out.println(PhoneNumberUtil.formateToPhoneNumber(num,"(XXX)-XXX-XXXX",10));
}
вывод: (123) -456-7890
u может указать любой формат, такой как XXX-XXX-XXXX и длину номера телефона, если длина ввода больше указанной длины, тогда строка будет обрезана.
Получите мой класс отсюда: https://github.com/gajeralalji/PhoneNumberUtil/blob/master/PhoneNumberUtil.java
Ответ 11
Pattern phoneNumber = Pattern.compile("(\\d{3})(\\d{3})(\\d{4})");
// ...
Matcher matcher = phoneNumber(numberAsLineOf10Symbols);
if (matcher.matches) {
return "(" + matcher.group(1) + ")-" +matcher.group(2) + "-" + matcher.group(3);
}
Ответ 12
Я бы подумал, что вам нужно использовать MessageFormat, а не DecimalFormat. Это должно быть более гибким.
Ответ 13
Вы также можете использовать подстроку и конкатенацию для легкого форматирования.
telephoneNumber = "("+telephoneNumber.substring(0, 3)+")-"+telephoneNumber.substring(3, 6)+"-"+telephoneNumber.substring(6, 10);
Но стоит отметить, что вы должны проверить длину поля номера телефона, чтобы убедиться, что ваше форматирование безопасно.
Ответ 14
String formatterPhone = String.format( "% s-% s-% s", phoneNumber.substring(0, 3), номер телефона .substring(3, 6), номер телефона .substring(6, 10));
Ответ 15
Использование StringBuilder
для производительности.
long number = 12345678L;
System.out.println(getPhoneFormat(String.valueOf(number)));
public static String getPhoneFormat(String number)
{
if (number == null || number.isEmpty() || number.length() < 6 || number.length() > 15)
{
return number;
}
return new StringBuilder("(").append(number.substring(0, 3))
.append(") ").append(number.substring(3, 6))
.append("-").append(number.substring(6))
.toString();
}