Hoe doen opmaken van een telefoonnummer als een Tekenreeks in Java?

Ik heb het opslaan van telefoonnummers zoals verlangt en wil ik gewoon toevoegen koppeltekens bij het afdrukken van het telefoonnummer als een string.

Ik geprobeerd met behulp van DecimalFormat maar dat houdt niet van het koppelteken. Waarschijnlijk omdat het bedoeld is voor het opmaken van decimale getallen en niet verlangt.

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

Ideaal, ik zou graag hebben haakje op het gebied code.

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

Wat is de juiste manier om dit te doen?

  • Het opslaan van telefoonnummers in een numeriek type zoals long is geen goed idee. Telefoon nummers zijn echt een soort van etiketten, geen nummers die je zou willen om berekeningen te maken met. Wat als er een telefoon nummer begint met 0 – kon je niet slaan, dat in een numeriek type.
InformationsquelleAutor styfle | 2011-02-25



15 Replies
  1. 40

    Kunt u gebruik maken van String.replaceFirst met regex methode, zoals de

        long phoneNum = 123456789L;
        System.out.println(String.valueOf(phoneNum).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1)-$2-$3"));
    • Ik gebruikte deze voor het genereren van willekeurige ID-nummers die volgens een bepaald formaat. Bedankt.
    • Regex is prima, maar in een krappe lus, dit zal zeer traag.
  2. 24

    Om uw gewenste output:

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

    Het resultaat op de Console ziet er zo uit:

    (012)-345-6789

    Voor het opslaan van telefoonnummers, moet u overwegen met behulp van gegevens van een ander type dan nummers.

  3. 16

    De eenvoudigste manier om dit te doen is door gebruik te maken van de ingebouwde MaskFormatter in de javax.swing.tekst bibliotheek.

    Je iets kunnen doen als deze :

    import javax.swing.text.MaskFormatter;
    
    String phoneMask= "###-###-####";
    String phoneNumber= "123423452345";
    
    MaskFormatter maskFormatter= new MaskFormatter(phoneMask);
    maskFormatter.setValueContainsLiteralCharacters(false);
    maskFormatter.valueToString(phoneNumber) ;
    • Erg makkelijk als je dat combineert met een DecimalFormat. De MaskFormatter ‘ s gecontroleerd ParseException is vervelend hoor.
    • Werkt goed. Ik maakte het een uitstekende methode.
  4. 8

    Als je echt nodig hebt op de juiste manier doet, dan kunt u gebruik maken van Google ‘ s recent open source libphonenumber

    • Ik denk niet dat een andere bibliotheek is noodzakelijk. Er moet een eenvoudige manier om het te doen met alle verschillende Java-opmaak-Api ‘ s. Ik weet niet welke je moet gebruiken.
    • opmaak alleen is niet het probleem, het opslaan van een telefoonnummer in een long is.
  5. 5

    De slechtst mogelijke oplossing zou zijn:

    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);
    • Upvote voor awesomeness
    • Ik betwijfel dat is de ergste – ontwikkelaars kunnen zeer creatieve [:-)
  6. 5

    Dit is hoe ik het deed het:

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

    Ik begrijp dat dit niet ondersteunt internationale nummers, maar ik ben niet het schrijven van een “echte” applicatie, dus ik ben niet bezorgd over. Ik accepteer alleen een 10 tekens lang als een telefoonnummer. Ik wilde alleen maar af te drukken met een bepaalde opmaak.

    Bedankt voor de reacties.

  7. 4

    U kan ook gebruik maken van https://github.com/googlei18n/libphonenumber. Hier is een voorbeeld:

    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 kunt u de bibliotheek op uw classpath: http://mvnrepository.com/artifact/com.googlecode.libphonenumber/libphonenumber

  8. 3

    Kunt u de uitvoering van uw eigen methode om dat te doen voor u, adviseer ik u iets zoals dit. Met behulp van DecimalFormat en MessageFormat. Met deze methode kunt u vrij veel gebruik maken van wat je wilt (String,Integer,Float,Double) en de output zal worden altijd rechts.

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

    Resultaat zal worden

    (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. 2

    DecimalFormat verbiedt willekeurige tekst binnen het aantal dat moet worden geformatteerd, net als een prefix of een suffix. Dus het zal niet in staat zijn om u te helpen er.

    In mijn mening, het opslaan van een telefoonnummer als een numerieke waarde is verkeerd, geheel. Wat als ik wil opslaan van een internationaal nummer? Veel landen gebruiken + te geven aan een landcode (bijvoorbeeld +1 voor USA/Canda), anderen gebruiken 00 (bijv. 001).

    Beide kan niet echt vertegenwoordigd worden in een numeriek type gegevens (“Is dat aantal 1555123 of 001555123?”)

  10. 2

    U kunt de notatie van een tekenreeks bevat niet-numerieke tekens ook naar uw gewenste formaat gebruik mijn util klasse-indeling

    gebruik is zeer eenvoudig

    public static void main(String[] args){
        String num = "ab12345*&67890";
    
        System.out.println(PhoneNumberUtil.formateToPhoneNumber(num,"(XXX)-XXX-XXXX",10));
    }

    output: (123)-456-7890

    u kunt opgeven dat een foramt zoals XXX-XXX-XXXX en de lengte van het nummer , als input lengte groter is dan de opgegeven lengte vervolgens reeks zal worden getrimd.

    Mijn klas is hier te vinden: https://github.com/gajeralalji/PhoneNumberUtil/blob/master/PhoneNumberUtil.java

  11. 2
    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. 1

    Je kon gebruik maken van de substring en samenvoeging voor het eenvoudig opmaken ook.

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

    Maar één ding op te merken is dat u moet controleren voor de lengte van het telefoon nummer veld om er zeker van te zijn dat uw opmaak is veilig.

  13. 1

    String formatterPhone = String.indeling(“%s-%s-%s”, telefoonnumer.substring(0, 3), telefoonnummer.substring(3, 6), telefoonnummer.substring(6, 10));

    • Kunt u informatie over wat er precies die code doet? Een code alleen beantwoorden zonder uit te leggen wat het doet is het minder nuttig. Ook, formaat, zodat het verschijnt als een code.
    • Het formaat van uw vraag zodat ze beter leesbaar zijn.
  14. 0

    Met StringBuilder zijn voor de prestaties.

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *