繁体   English   中英

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

[英]Format string phone number MVC Razor without parsing to decimal

我正在尝试格式化从我的viewModel循环的电话号码,如下所示: (###) ###-####而不必将字符串解析为小数。

此方法Formatting is specified, but argument is not IFormattableFormatting 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM