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