Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中将电话号码格式化为字符串?_Java_String_Number Formatting - Fatal编程技术网

如何在Java中将电话号码格式化为字符串?

如何在Java中将电话号码格式化为字符串?,java,string,number-formatting,Java,String,Number Formatting,我一直将电话号码存储为long,我只想在将电话号码打印为字符串时添加连字符 我尝试使用DecimalFormat,但那不喜欢连字符。可能是因为它是用来格式化十进制数字的,而不是长的 long phoneFmt = 123456789L; DecimalFormat phoneFmt = new DecimalFormat("###-###-####"); System.out.println(phoneFmt.format(phoneNum)); //doesn't work as I had

我一直将电话号码存储为long,我只想在将电话号码打印为字符串时添加连字符

我尝试使用
DecimalFormat
,但那不喜欢连字符。可能是因为它是用来格式化十进制数字的,而不是长的

long phoneFmt = 123456789L;
DecimalFormat phoneFmt = new DecimalFormat("###-###-####");
System.out.println(phoneFmt.format(phoneNum)); //doesn't work as I had hoped
理想情况下,我也希望在区号上加括号

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

正确的方法是什么?

如果你真的需要正确的方法,那么你可以使用谷歌最近的开源软件

最糟糕的解决方案是:

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

我认为你需要使用MessageFormat而不是DecimalFormat。这应该更灵活。

十进制格式
不允许对数字中的任意文本进行格式化,就像前缀或后缀一样。所以它在这方面帮不了你

在我看来,将电话号码存储为数值是完全错误的。如果我想储存一个国际号码怎么办?许多国家使用
+
表示国家代码(例如,美国/加拿大使用
+1
),其他国家使用
00
(例如
001


这两种类型都不能用数字数据类型表示(“该数字是1555123还是001555123?”)

要获得所需的输出:

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


对于存储电话号码,你应该考虑。

< P>这是我如何结束的:

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();
}
专用字符串打印电话(长phoneNum){
StringBuilder sb=新StringBuilder(15);
StringBuilder temp=新的StringBuilder(phoneNum.toString());
while(温度长度()<10)
温度插入(0,“0”);
char[]chars=temp.toString().toCharray();
某人加上(“”);
for(int i=0;i
我知道这不支持国际数字,但我不是在写一个“真正的”应用程序,所以我不担心这个问题。我只接受10个字符作为电话号码。我只是想打印一些格式

感谢您的回复。

您可以与regex方法一起使用,如

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

最简单的方法是使用中的内置MaskFormatter

您可以这样做:

import javax.swing.text.MaskFormatter;

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

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

也可以使用子字符串和连接来轻松格式化

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

但需要注意的是,您必须检查电话号码字段的长度,以确保格式安全。

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

您也可以使用。以下是一个例子:

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

在这里,您可以在类路径上获取库:

您可以将任何包含非数字字符的字符串格式化为所需格式,也可以使用my util类进行格式化

用法很简单 输出:(123)-456-7890 您可以指定任何foramt,如XXX-XXX-XXXX和电话号码的长度,若输入长度大于指定长度,则字符串将被修剪


从这里获取我的类:

您可以实现自己的方法来完成此任务,我建议您使用类似这样的方法。使用
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);
    }
}

使用
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();

}
long number=12345678L;
System.out.println(getPhoneFormat(String.valueOf(number));
公共静态字符串getPhoneFormat(字符串编号)
{
如果(number==null | | number.isEmpty()| | number.length()<6 | | number.length()>15)
{
返回号码;
}
返回新的StringBuilder(“”).append(number.substring(0,3))
.append(“)”.append(数字子字符串(3,6))
.append(“-”).append(数字子字符串(6))
.toString();
}
Kotlin

val number = 088899998888

val phone = number.phoneFormatter()

fun String.phoneFormatter(): String { return this.replace("\\B(?=(\\d{4})+(?!\\d))".toRegex(), "-") }
结果将是
0888-9999-8888

我使用了这个

字符串columValue=“1234567890


字符串编号=columValue.replaceFirst((\d{3})(\d{3})(\d+),“($1)$2-$3”)

我认为不需要另一个库。使用所有不同的Java格式化API必须有一种简单的方法。我只是不知道该使用哪一种。@Stifle:格式化本身不是你的问题,将电话号码存储在
long
中是一个问题。将电话号码存储在
long
等数字类型中不是一个好主意。Phone数字实际上是一种标签,而不是你想用来计算的数字。如果电话号码以0开头怎么办?你不能将其存储在数字类型中。我使用它来生成遵循特定格式的随机ID号。谢谢。正则表达式很好,但在一个紧密的循环中,这将非常缓慢。如果你将它与De结合起来,这将非常容易cimalFormat。MaskFormatter的checked ParseException很烦人。效果很好。我把它作为一种实用方法。你能添加关于代码具体功能的信息吗?只回答代码而不解释它的功能是不太有用的。另外,格式化它使其看起来像代码一样。我怀疑这是最糟糕的-开发人员可能非常有创造力[:-)
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);
}
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();

}
val number = 088899998888

val phone = number.phoneFormatter()

fun String.phoneFormatter(): String { return this.replace("\\B(?=(\\d{4})+(?!\\d))".toRegex(), "-") }