我正在尝试创建一个格式化美国电话号码的功能 - 希望不会遍历每个数字。
当全部通过10位数时很好。超过10位数的传递方式 我希望String.Format方法在右侧追加扩展数字。例如:
当结果中传递的14位数字应为:(444)555-2222 x8888 当结果中传递的12位数字应为:(444)555-2222 x88 等等 然而,我目前的尝试得到的是: 传入12位数字会返回此字符串'() - 949 x555444433'
这是我到目前为止所拥有的。
public static string _FormatPhone(object phonevalue)
{
Int64 phoneDigits;
if (Int64.TryParse(phonevalue.ToString(), out phoneDigits))
{
string cleanPhoneDigits = phoneDigits.ToString();
int digitCount = cleanPhoneDigits.Length;
if (digitCount == 10)
return String.Format("{0:(###) ###-####}", phoneDigits);
else if (digitCount > 10)
return String.Format("{0:(###) ###-#### x#########}", phoneDigits);
else
return cleanPhoneDigits;
}
return "Format Err#";
}
提前致谢。
答案 0 :(得分:2)
我认为你必须将你的phoneDigits字符串分成前10位和其余的数字。
//[snip]
else if (phoneDigits.ToString().Length > 10)
{
return String.Format("{0:(###) ###-#### x}{1}", phoneDigits.Substring(0,10), phoneDigits.Substring(10) );
}
//[snip]
答案 1 :(得分:1)
我建议将其视为一串数字,而不是数字。然后,您将明确使用Substring来分解部分。
答案 2 :(得分:1)
试着把它挤成1行,我想出了这个。
var phoneNumber = "(999) 555-4455 ext123";
phoneNumber = Regex.Replace(phoneNumber, "(.*?)([+]\\d{1,3})?(.*?)(\\d{3})(.*?)(\\d{3})(.*?)(\\d{4})([ ]+)?(x|ext)?(.*?)(\\d{2,5})?(.*?)$", "$2 $4 $6 $8 $10$12").Trim().Replace("ext","x");
如果它以+#开头,它将独自留下。然后它会查找数字块。 3,3,4然后它查找ext或x表示扩展名和另外2-5个数字。那时你可以随意格式化它,我选择了空格。
1234567890 - > '123 456 7890'
(123)456.7890 - > '123 456 7890'
+1 (999)555-4455 ext123 - > '+1 999 555 4455 x123'
答案 3 :(得分:0)
尝试使用正则表达式:
class Program
{
static void Main(string[] args)
{
var g = FormatUSPhone("444555222234");
}
public static string FormatUSPhone(string num)
{
string results = string.Empty;
if(num.Length == 10)
{
num = num.Replace("(", "").Replace(")", "").Replace("-", "");
const string formatPattern = @"(\d{3})(\d{3})(\d{4})";
results = Regex.Replace(num, formatPattern, "($1) $2-$3");
}else if (num.Length == 12)
{
num = num.Replace("(", "").Replace(")", "").Replace("-", "");
const string formatPattern = @"(\d{3})(\d{3})(\d{4})(\d{2})";
results = Regex.Replace(num, formatPattern, "($1) $2-$3 x$4");
}
return results;
}
我从我发现here的例子中编辑了上述内容。玩上面的代码,看看它是否对你有帮助。
答案 4 :(得分:0)
使用正则表达式:
Regex usPhoneRegex = new Regex(@"(\d{3})(\d{3})(\d{4})(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
string USPhoneFormatString = "$1-$2-$3 x$4";
return usPhoneRegex.Replace("312588230012999", USPhoneFormatString));
主电话号码后的任何内容都将作为分机返回
由于您在代码中使用了int64,我的正则表达式假设电话号码中没有空格或标点符号。
- 编辑 - 艾哈迈德指出,我没有处理没有延期的号码的情况。所以这是一个使用MatchEvaluator来完成工作的修订版本。它比其他答案好吗?我不知道 - 但这是一种不同的方法,所以我想我会把它丢在那里。
Regex usPhoneRegex = new Regex(@"(\d{3})(\d{3})(\d{4})(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
return usPhoneRegex.Replace("3125882300", new MatchEvaluator(MyClass.formatPhone))
public static string formatPhone(Match m) {
int groupIndex = 0;
string results = string.Empty;
foreach (Group g in m.Groups) {
groupIndex +=1;
switch (groupIndex) {
case 2 :
results = g.Value;
break;
case 3 :
case 4 :
results += "-" + g.Value;
break;
case 5 :
if (g.Value.Length != 0) {
results += " x " + g.Value;
}
break;
}
}
return results;
}
这可能应该使用StringBuilder。
答案 5 :(得分:0)
问题出在else if
条件中,您有一定数量的#
占位符来处理电话号码扩展名。相反,我们可以动态定义格式以考虑不同的长度。
你为什么要传递object
?你到处都在使用ToString()
。为什么不从一开始传入string
?如果您传入的项目不是字符串,则在传入之前调用ToString
,或将ToString()
结果保存在方法中的变量中,如下所示。
以下是您的方法的更新版本:
public static string _FormatPhone(object phonevalue)
{
string returnPhone = "Format Err#";
Int64 phoneDigits;
string phoneNumber = phonevalue.ToString();
if (Int64.TryParse(phoneNumber, out phoneDigits))
{
if (phoneNumber.Length == 10)
{
return phoneDigits.ToString("(###) ###-####");
}
else if (phoneNumber.Length > 10)
{
// determine the length of placeholders needed for the format
string format = "(###) ###-#### x"
+ new string('#', phoneNumber.Length - 10);
return phoneDigits.ToString(format);
}
else
{
return phoneNumber;
}
}
return returnPhone;
}
测试它:
string[] inputs = { "456", "4445552222", "444555222288", "44455522226789" };
foreach (string input in inputs)
{
Console.WriteLine("Format Result: " + _FormatPhone(input));
}
在这种情况下不需要正则表达式。如果你真的想使用一个,你的替换方法需要确定长度,以便在需要时附加扩展名,如下所示:
string[] inputs = { "456", "4445552222", "444555222288", "44455522226789" };
string pattern = @"(\d{3})(\d{3})(\d{4})(\d*)";
foreach (string input in inputs)
{
string result = Regex.Replace(input, pattern, m =>
{
if (m.Value.Length >= 10)
{
return String.Format("({0}) {1}-{2}",
m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value)
+ (m.Value.Length > 10 ? " x" + m.Groups[4].Value : "");
}
return m.Value;
});
Console.WriteLine("Regex result: " + result);
}