[英]Format string phone number MVC Razor without parsing to decimal
我正在尝试格式化从我的viewModel循环的电话号码,如下所示: (###) ###-####
而不必将字符串解析为小数。
此方法Formatting is specified, but argument is not IFormattable
了Formatting is specified, but argument is not IFormattable
错误:
@foreach (var client in Model.Clients)
{
<td>@String.Format("{0:(###) ###-####}", client.TelephoneNumber)</td>
}
所以,我需要解析为小数:
@foreach (var client in Model.Clients)
{
<td>@String.Format("{0:(###) ###-####}", Decimal.Parse(client.TelephoneNumber))</td>
}
但是无法保证循环的数字只是数字,因此最有可能至少一次解析尝试失败。
有没有办法实现这种格式,而无需解析为小数?
如果您的TelephoneNumber
是一个string
您始终可以使用子字符串格式化数字。 它不是那么干净,但你不需要任何单独的库并转换为decimal
:
@String.Format("({0}) {1}-{2}"
, client.TelephoneNumber.Substring(0, 3)
, client.TelephoneNumber.Substring(3, 3)
, client.TelephoneNumber.Substring(6, client.TelephoneNumber.Length - 6))
试试这个,你可以把它放在某个地方的静态函数中重复使用。
var match = Regex.Match("1231231234", @"(\d{3})(\d{3})(\d{4})");
Console.WriteLine( "(" + match.Groups[1] + ") " + match.Groups[2] + "-" + match.Groups[3]);
如果您只处理10位数的电话号码,甚至更容易:
Regex.Replace(phoneNum, @"(\d{3})(\d{3})(\d{4})", "($1) $2-$3");
如果您只对显示电话号码感兴趣,可以将其设为HTML帮助:
public static MvcHtmlString FormatPhoneNum(this HtmlHelper helper, string phoneNum)
{
//You could strip non-digits here to make it more robust
if (String.IsNullOrEmpty(phoneNum)) return phoneNum;
return new MvcHtmlString(Regex.Replace(phoneNum, @"(\d{3})(\d{3})(\d{4})", "($1) $2-$3")); //US Phone Number
}
然后像这样使用:
@foreach (var client in Model.Clients)
{
<td>@Html.FormatPhoneNumber(client.TelephoneNumber)</td>
}
如果您还需要编辑电话号码并希望在编辑器文本框中显示格式,则可以在视图模型上创建包装器属性以转换电话号码:
public class Client
{
public string TelephoneNumber {get; set;}
//Require 10 digits, each surrounded by any non-digit characters (will strip all non-digits)
[RegularExpression(@"(\D*\d\D*){10}", ErrorMessage = "Please enter a 10 digit phone number")]
public string FormattedPhoneNum
{
get
{
MyHelpers.FormatPhoneNumber(TelephoneNumber);
}
set
{
TelephoneNumber = MyHelpers.StripPhoneNumber(value);
}
}
}
public class MyHelpers
{
public static StripPhoneNumber(string phone)
{
if (phone == null)
return phone;
else
return _nonDigits.Replace(phone, String.Empty);
}
public static string FormatPhoneNumber(string phoneNum)
{
phoneNum = StripPhoneNumber(phoneNum);
if (String.IsNullOrEmpty(phoneNum)) return phoneNum;
return Regex.Replace(phoneNum, @"(\d{3})(\d{3})(\d{4})", "($1) $2-$3"); //US Phone Number
}
}
请注意属性上的RegularExpressionAttribute。 对用户输入采取非常宽松的立场。 只要用户在文本框中输入至少10位数字而不管输入的其他任何字符,都会感到满意。您可能需要根据自己的需要对此进行更严格的限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.