webentwicklung-frage-antwort-db.com.de

Wie formatiere ich eine Telefonnummer als String in Java?

Ich habe Telefonnummern als Longs gespeichert und möchte beim Drucken der Telefonnummer einfach Striche als Zeichenfolge hinzufügen.

Ich habe versucht, DecimalFormat zu verwenden, aber das gefällt dem Bindestrich nicht. Wahrscheinlich, weil es für die Formatierung von Dezimalzahlen und nicht für Longs gedacht ist.

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

Im Idealfall hätte ich auch gerne Klammern über die Vorwahl.

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

Was ist der richtige Weg, dies zu tun?

24
styfle

So habe ich es gemacht:

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

Ich verstehe, dass dies keine internationalen Nummern unterstützt, aber ich schreibe keine "echte" Anwendung, also bin ich darüber nicht besorgt. Ich akzeptiere nur 10 Zeichen lang als Telefonnummer. Ich wollte es nur mit etwas Formatierung drucken.

Danke für die Antworten.

5
styfle

Sie können String.replaceFirst mit der Regex-Methode verwenden 

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

Um Ihre gewünschte Ausgabe zu erhalten:

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

Das Ergebnis in der Konsole sieht folgendermaßen aus:

(012) -345-6789

Zum Speichern von Telefonnummern sollten Sie mit einem anderen Datentyp als Nummern verwenden.

24
Tomas Narros

Dies erreichen Sie am einfachsten mit dem integrierten MaskFormatter in der Bibliothek javax.swing.text .

Sie können so etwas tun: 

import javax.swing.text.MaskFormatter;

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

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

Wenn Sie wirklich den richtigen Weg benötigen, können Sie das kürzlich geöffnete libphonenumber von Google verwenden.

8

Die schlechteste Lösung wäre:

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

Sie können Ihre eigene Methode implementieren, um dies für Sie zu tun. Ich empfehle Ihnen, etwas wie dieses zu verwenden. Verwendung von DecimalFormat und MessageFormat. Mit dieser Methode können Sie so ziemlich alles verwenden, was Sie möchten (String,Integer,Float,Double), und die Ausgabe ist immer richtig.

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

Ergebnis wird sein 

(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

Sie können jede Zeichenfolge, die nicht numerische Zeichen enthält, auch in das von Ihnen gewünschte Format formatieren

die Verwendung ist sehr einfach

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

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

ausgabe: (123) -456-7890

sie können ein beliebiges Format wie XXX-XXX-XXXX und die Länge der Telefonnummer angeben. Wenn die Eingabelänge größer als die angegebene Länge ist, wird die Zeichenfolge abgeschnitten.

Holen Sie sich meine Klasse hier: https://github.com/gajeralalji/PhoneNumberUtil/blob/master/PhoneNumberUtil.Java

2
Lalji Gajera

Sie können auch https://github.com/googlei18n/libphonenumber verwenden. Hier ist ein Beispiel: 

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

Hier können Sie die Bibliothek in Ihrem Klassenpfad abrufen: http://mvnrepository.com/artifact/com.googlecode.libphonenumber/libphonenumber

2

DecimalFormat erlaubt nicht die Formatierung beliebiger Texte innerhalb der Zahl, nur als Präfix oder Suffix. Also kann es dir dort nicht helfen.

Meines Erachtens ist das Speichern einer Telefonnummer als numerischer Wert völlig falsch. Was ist, wenn ich eine internationale Nummer speichern möchte? Viele Länder verwenden +, um einen Ländercode anzugeben (z. B. +1 für USA/Canda), andere verwenden 00 (z. B. 001).

Beide können nicht wirklich in einem numerischen Datentyp dargestellt werden ("Ist diese Nummer 1555123 oder 001555123?")

2
Joachim Sauer

Ich hätte gedacht, dass Sie ein MessageFormat anstelle von DecimalFormat verwenden müssen. Das sollte flexibler sein.

1
Richard Miskin

Sie können die Teilzeichenfolge und Verkettung auch für die einfache Formatierung verwenden.

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

Zu beachten ist jedoch, dass Sie die Länge des Telefonnummernfelds überprüfen müssen, um sicherzustellen, dass Ihre Formatierung sicher ist.

1
Div

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

1
user3753036

Verwenden Sie StringBuilder für die Leistung.

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