web-dev-qa-db-fra.com

Comment formater un numéro de téléphone sous forme de chaîne en Java?

J'ai stocké des numéros de téléphone longs et je voudrais simplement ajouter des traits d'union lors de l'impression du numéro de téléphone sous forme de chaîne.

J'ai essayé d'utiliser DecimalFormat mais cela n'aime pas le trait d'union. Probablement parce qu'il est destiné à formater des nombres décimaux et non plus long.

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

Idéalement, j'aimerais aussi avoir des parenthèses sur l'indicatif régional.

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

Quelle est la bonne façon de faire cela?

24
styfle

Voici comment j'ai fini par le faire:

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();
}

Je comprends que cela ne prend pas en charge les numéros internationaux, mais je n’écris pas une "vraie" application, je ne suis donc pas préoccupé par cela. Je n'accepte que 10 caractères comme numéro de téléphone. Je voulais juste l'imprimer avec un peu de formatage.

Merci pour les réponses.

5
styfle

Vous pouvez utiliser String.replaceFirst avec une méthode regex comme 

    long phoneNum = 123456789L;
    System.out.println(String.valueOf(phoneNum).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1)-$2-$3"));
38
hhbarriuso

Pour obtenir le résultat souhaité:

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));

Le résultat sur la console ressemble à ceci:

(012) -345-6789

Pour stocker des numéros de téléphone, vous devez envisager en utilisant un type de données autre que des chiffres .

24
Tomas Narros

Le moyen le plus simple de procéder consiste à utiliser MaskFormatter intégré à la bibliothèque javax.swing.text .

Vous pouvez faire quelque chose comme ça: 

import javax.swing.text.MaskFormatter;

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

MaskFormatter maskFormatter= new MaskFormatter(phoneMask);
maskFormatter.setValueContainsLiteralCharacters(false);
maskFormatter.valueToString(phoneNumber) ;
15
lac_dev

Si vous avez vraiment besoin de la bonne manière, vous pouvez utiliser la source ouverte récente de Google libphonenumber

8
Aravind R. Yarram

La pire solution possible serait:

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);
5
Vanya

Vous pouvez implémenter votre propre méthode pour le faire pour vous, je vous recommande d'utiliser quelque chose comme ça. Utiliser DecimalFormat et MessageFormat. Avec cette méthode, vous pouvez utiliser à peu près tout ce que vous voulez (String,Integer,Float,Double) et la sortie sera toujours exacte.

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);
    }
}

Le résultat sera 

(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

Vous pouvez aussi formater toute chaîne contenant des caractères non numériques au format souhaité, utilisez ma classe util pour formater

l'utilisation est très simple

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

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

sortie: (123) -456-7890

vous pouvez spécifier n’importe quel format tel que XXX-XXX-XXXX et la longueur du numéro de téléphone. Si la longueur saisie est supérieure à la longueur spécifiée, la chaîne sera coupée.

Obtenez mon cours ici: https://github.com/gajeralalji/PhoneNumberUtil/blob/master/PhoneNumberUtil.Java

2
Lalji Gajera

Vous pouvez également utiliser https://github.com/googlei18n/libphonenumber . Voici un exemple: 

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);

Ici vous pouvez obtenir la bibliothèque sur votre chemin de classe: http://mvnrepository.com/artifact/com.googlecode.libphonenumber/libphonenumber

2
Ondrej Kvasnovsky

DecimalFormat n'autorise pas le texte arbitraire entre le nombre à formater, tout comme un préfixe ou un suffixe. Donc, il ne pourra pas vous aider là-bas.

À mon avis, enregistrer un numéro de téléphone sous forme de valeur numérique est totalement faux. Et si je veux stocker un numéro international? De nombreux pays utilisent + pour indiquer un code de pays (par exemple, +1 pour USA/Canda), d'autres utilisent 00 (par exemple, 001).

Les deux ne peuvent pas vraiment être représentés dans un type de données numérique ("Est-ce que ce nombre est 1555123 ou 001555123?")

2
Joachim Sauer

J'aurais pensé que vous deviez utiliser un MessageFormat plutôt que DecimalFormat. Cela devrait être plus flexible.

1
Richard Miskin

Vous pouvez également utiliser la sous-chaîne et la concaténation pour faciliter la mise en forme.

telephoneNumber = "("+telephoneNumber.substring(0, 3)+")-"+telephoneNumber.substring(3, 6)+"-"+telephoneNumber.substring(6, 10);

Mais une chose à noter est que vous devez vérifier la longueur du champ du numéro de téléphone pour vous assurer que votre formatage est sécurisé.

1
Div

String formatterPhone = String.format ("% s-% s-% s", phoneNumber.substring (0, 3), phoneNumber.substring (3, 6), phoneNumber.substring (6, 10));

1
user3753036

Utiliser StringBuilder pour les performances.

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(25).append("(").append(number.substring(0, 3))
            .append(") ").append(number.substring(3, 6))
            .append("-").append(number.substring(6))
            .toString();

}
0
trilogy
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);
}
0
Alexey Smirnov