Как отформатировать номер телефона в виде строки в Java? - PullRequest
26 голосов
/ 25 февраля 2011

Я храню телефонные номера как длинные, и я хотел бы просто добавить дефисы при печати телефонного номера в виде строки.

Я пытался использовать DecimalFormat, но дефис не понравился.Вероятно, потому что он предназначен для форматирования десятичных чисел, а не длинных.

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

В идеале, я бы тоже хотел иметь круглые скобки для кода города.

new DecimalFormat("(###)-###-####");

Какой правильный путьсделать это?

Ответы [ 15 ]

40 голосов
/ 25 февраля 2011

Вы можете использовать String.replaceFirst с методом регулярного выражения, например

    long phoneNum = 123456789L;
    System.out.println(String.valueOf(phoneNum).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1)-$2-$3"));
24 голосов
/ 25 февраля 2011

Чтобы получить желаемый результат:

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

Для хранения телефонных номеров вы должны рассмотреть , используя тип данных, отличный от номеров .

15 голосов
/ 09 августа 2013

Самый простой способ сделать это - использовать встроенный 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) ;
8 голосов
/ 25 февраля 2011

Если вам действительно нужен правильный путь, вы можете использовать недавно открытый исходный код Google libphonenumber

5 голосов
/ 25 февраля 2011

Вот как я это сделал:

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 символов в качестве номера телефона.Я просто хотел напечатать его с некоторым форматированием.

Спасибо за ответы.

5 голосов
/ 25 февраля 2011

Наихудшее из возможных решений:

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);
4 голосов
/ 16 августа 2015

Вы также можете использовать 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

3 голосов
/ 25 апреля 2016

Вы можете реализовать свой собственный метод, чтобы сделать это для вас, я рекомендую вам использовать что-то вроде этого. Использование 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
2 голосов
/ 26 февраля 2016

U может форматировать любую строку, содержащую не числовые символы, также в желаемый формат, используйте мой класс утилит для форматирования

Использование очень просто

public static void main(String[] args){
    String num = "ab12345*&67890";

    System.out.println(PhoneNumberUtil.formateToPhoneNumber(num,"(XXX)-XXX-XXXX",10));
}

выход: (123) -456-7890

Вы можете указать любую форму, например, XXX-XXX-XXXX и длину телефонного номера, если длина ввода больше указанной длины, строка будет обрезана.

Получите мой класс отсюда: https://github.com/gajeralalji/PhoneNumberUtil/blob/master/PhoneNumberUtil.java

2 голосов
/ 25 февраля 2011

DecimalFormat не допускает произвольного текста в пределах числа для форматирования, так же как префикс или суффикс. Так что он не сможет вам там помочь.

На мой взгляд, хранить номер телефона в виде числового значения - это неправильно. Что если я хочу сохранить международный номер? Многие страны используют + для обозначения кода страны (например, +1 для США / Канда), другие используют 00 (например, 001).

Оба они не могут быть представлены в числовом типе данных («Это число 1555123 или 001555123?»)

...