web-dev-qa-db-ja.com

Javaで電話番号を文字列としてフォーマットするにはどうすればよいですか?

電話番号を長い間保存していたので、電話番号を文字列として印刷するときにハイフンを追加したいだけです。

DecimalFormatを使用してみましたが、ハイフンが好きではありません。おそらく、10進数をフォーマットするためのものであり、長整数型ではないためです。

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

理想的には、市外局番にも括弧を付けたいと思います。

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

これを行う正しい方法は何ですか?

26
styfle

これは私がそれをやった方法です:

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
styfle

次のような正規表現メソッドで String.replaceFirst を使用できます

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

目的の出力を取得するには:

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

電話番号を保存するには、 数字以外のデータ型を使用 を検討する必要があります。

24
Tomas Narros

これを行う最も簡単な方法は、組み込みのMaskFormatterを javax.swing.text library で使用することです。

次のようなことができます:

import javax.swing.text.MaskFormatter;

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

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

本当に正しい方法が必要な場合は、最近オープンソース化されたGoogleの libphonenumber を使用できます

8

最悪の解決策は次のとおりです。

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

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

4

あなたはあなたのためにそれを行うために独自のメソッドを実装することができます、私はこのような何かを使用することをお勧めします。 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

Uは、数字以外の文字を含む任意の文字列を目的の形式にフォーマットできます。myutilクラスを使用してフォーマットします

使い方はとても簡単です

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

2
Lalji Gajera
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);
}
2
Alexey Smirnov

DecimalFormatでは、任意のテキストを使用できませんwithinプレフィックスまたはサフィックスとしての数値をフォーマットします。ですから、そこであなたを助けることはできません。

私の意見では、電話番号を数値として保存することはまったく間違っています。国際番号を保存したい場合はどうすればよいですか?多くの国で+は国コードを示します(例:+1 USA/Candaの場合)、その他は00(例:001)。

どちらも数値データ型で実際に表すことはできません(「その番号は1555123または001555123ですか?」)

2
Joachim Sauer

DecimalFormatではなくMessageFormatを使用する必要があると思っていました。それはより柔軟でなければなりません。

1
Richard Miskin

部分文字列と連結を使用して、簡単にフォーマットすることもできます。

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

しかし、注意すべきことの1つは、フォーマットが安全であることを確認するためだけに、電話番号フィールドの長さをチェックする必要があるということです。

1
DiTap

文字列formatterPhone = String.format( "%s-%s-%s"、phoneNumber.substring(0、3)、phoneNumber.substring(3、6)、phoneNumber.substring(6、10));

1
user3753036

パフォーマンスのために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();

}
0
trilogy