格式字符串电话号码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>
}

但是不能保证被循环的数字都是数字,所以很可能至少有一次解析尝试会失败。

是否有一种方法可以实现这种格式而不需要解析为十进制?

格式字符串电话号码MVC Razor不解析为十进制

如果您的TelephoneNumberstring,您总是可以使用子字符串来格式化数字。它不是那么干净,但你不需要任何单独的库,并转换为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个数字,无论输入任何其他字符,它都是满意的。您可能需要为自己的目的设置更严格的限制。