HOWTO · Csharp

在 C# 中将字符串格式化为电话号码

在本文中,介绍了如何在 C# 中将字符串格式化为电话号码。

本页内容

电话号码的格式取决于输入所代表的内容。如果数字包含在一个字符串中,可以使用自定义格式化方法移除分隔符并应用显示格式。如果区号和其他部分已经分开,则可以使用 String.Format 或字符串插值来组合它们。这两种方法都不会解析任意电话号码字符串,也不会检查号码是否有效。

选择一种 C# 电话号码格式化方法

当输入是一个字符串,且你想在显示前统一其标点格式时,可以使用自定义方法。下面的示例采用默认格式 (##) ###-####,将九位数字分成两位、三位和四位。可以根据应用所需的号码编排方式修改格式;这只是显示格式的选择,并非通用的电话号码标准。

如果号码已经拆分为区号和两个本地号码部分,可以使用 String.Format 或字符串插值将这些值组合成字符串。这些方法会保留传入的各部分,不会判断如何拆分或清理它们。两种方法都不会验证国家代码、分机号,也不会检查最终号码是否能够拨通。

在 C# 中使用自定义方法将字符串格式化为电话号码

formatPhNumber() 方法接受输入字符串和必需的格式参数。传入 string.Empty 或 null 可使用默认格式 (##) ###-####;传入其他 .NET 自定义数值格式字符串,则可选择不同的显示格式。格式化前,该方法会移除 ASCII 数字以外的字符。如果输入中不含 ASCII 数字,方法会返回空字符串。

完整实现见最后一节。其核心操作是 Regex.Replace(phoneNum ?? "", @"[^0-9]", string.Empty) 和 Convert.ToInt64(digits).ToString(phoneFormat)。传入格式参数后,调用方可以更改显示格式,而无需更改清理步骤。该方法适用于已知且长度固定的显示约定,不适合解析一般的国际电话号码。

使用 String.Format 格式化电话号码的各部分

String.Format("({0}) {1}-{2}", areaCode, firstPart, secondPart) 会将三个现有字符串放入指定位置。例如,第一个参数填入 {0},第二个参数填入 {1},第三个参数填入 {2}。如果应用程序的其他部分已经解析或收集了这些组成部分,这种方式就很合适。

占位符只负责排列文本;它们不会移除标点、推断组成部分的边界,也不会验证长度。如果应用需要特定格式,请分别验证各部分。String.Format 是这里使用的 API 名称;它由 System.String 提供,在 C# 代码中通常以 string.Format 的形式调用。

使用字符串插值格式化电话号码的各部分

字符串插值可以直接表达相同的组合方式:$"({areaCode}) {firstPart}-{secondPart}"。花括号中的表达式会插入周围的字符串中。如果各部分已经是命名变量,这种写法会更简洁;它与 String.Format 的适用范围相同:组合已有值,但不会解析或验证完整的电话号码字符串。

可以根据哪种写法在上下文代码中更清晰,选择字符串插值或 String.Format。两者都不会更改输入值,也不会自动应用电话号码规则。

自定义格式化方法的局限

这个自定义格式化方法有意将输入视为要显示的数字。它不会保留开头的零:将清理后的数字转换为 long 时,会把它解析为数值,因此格式化前开头的零就会被丢弃。数字位数超过 Int64 可表示范围时,Convert.ToInt64 会抛出 OverflowException。此外,该方法假定所请求的格式适用于数值格式化;不合适的格式可能产生意外结果,也可能导致失败。

如果电话号码中的开头零很重要、号码长度可能变化,或数字可能超出 Int64 的范围,就不要将这些数字转换为整数。应将数字保留为文本,并按照明确选定的长度和号码规则插入分隔符;如果需要解析并验证不同地区的号码,则可以使用电话号码库。捕获转换错误可以避免应用程序崩溃,但不能因此让无法识别的号码变成有效号码。

完整的 C# 示例和输出

使用普通的九位数字作为输入运行此示例。示例会先移除输入中的非数字分隔符,然后应用默认显示格式。

本节中的代码以及显示的标签或输出仍为英文。

using System;
using System.Text.RegularExpressions;

class PhoneFormatter
{
    public static string formatPhNumber(string phoneNum, string phoneFormat)
    {
        if (phoneFormat == null || phoneFormat.Length == 0)
        {
            phoneFormat = "(##) ###-####";
        }

        string digits = Regex.Replace(phoneNum ?? "", @"[^0-9]", "");
        if (digits.Length == 0)
        {
            return "";
        }

        return Convert.ToInt64(digits).ToString(phoneFormat);
    }

    static void Main()
    {
        string phoneNumber = "123456789";
        Console.WriteLine(formatPhNumber(phoneNumber, null));
    }
}
(12) 345-6789