【问题标题】:Format string phone number MVC Razor without parsing to decimal格式化字符串电话号码MVC Razor而不解析为十进制
【发布时间】:2015-09-22 21:36:03
【问题描述】:

我正在尝试格式化从我的 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>
}

但不能保证循环输入的数字只是数字,因此很可能至少一次解析尝试会失败。

有没有办法实现这种格式而不需要解析为小数?

【问题讨论】:

  • 提供您期望的数据样本。然后考虑将值拆分为字符串。据我所知,您将无法将格式(即###-####)应用于字符串。
  • 您可以先尝试将正则表达式过滤器应用于client.TelephoneNumber 以仅获取数字,然后从那里继续。

标签: c# asp.net-mvc asp.net-mvc-4 razor string-formatting


【解决方案1】:

如果您的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))

【讨论】:

    【解决方案2】:

    试试这个,你可以把它放在某个静态函数中重复使用。

    var match = Regex.Match("1231231234", @"(\d{3})(\d{3})(\d{4})");
    Console.WriteLine( "(" + match.Groups[1] + ") " + match.Groups[2] + "-" + match.Groups[3]);
    

    【讨论】:

      【解决方案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 位数字即可满足要求,而不管输入的任何其他字符如何。您可能需要根据自己的目的将其设置得更严格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 2019-01-30
        相关资源
        最近更新 更多