格式字符串电话号码MVC Razor不解析为十进制
本文关键字:十进制 Razor 字符串 电话号码 MVC 格式 | 更新日期: 2023-09-27 18:14:06
我正在尝试格式化正在从我的viewModel循环的电话号码,像这样:(###) ###-####
而不必将字符串解析为小数。
此方法给出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
}
}
注意属性上的regulareexpression attribute。它对用户输入采取非常宽松的立场。只要用户在文本框中输入至少10个数字,无论输入任何其他字符,它都是满意的。您可能需要为自己的目的设置更严格的限制。