使用扩展方法/ htmlhelper的动态数字/货币格式

时间:2012-11-19 23:01:09

标签: asp.net-mvc c#-4.0 extension-methods html-helper string.format

我们的数据库存储值及其相关格式。有些数字在小数点后有0个数字,有些是货币等等,

我试图避免在每个实例中都需要显示数据。

@foreach (var i in Model.CandidateHireGoalsAndActivity)
{
    if (i.DataTypeId == 3)
    { 
        <tr>
            <td>@i.HireGoalName</td>
            <td>@i.ActivityValue.ToString("C0")</td>
            <td>@i.GoalValue.ToString("C0")</td>
        </tr>
    }
    else if (i.DataTypeId == 2)
    { 
        <tr>
            <td>@i.HireGoalName</td>
            <td>@i.ActivityValue.ToString("F2")</td>
            <td>@i.GoalValue.ToString("F2")</td>
        </tr>
    }
    else if....(etc)
}

我正在尝试编写一个接收字符串和所需格式的基本扩展方法,然后我的代码看起来更像这样。

    @foreach (var i in Model.CandidateHireGoalsAndActivity)
    {
       <tr>
          <td>@i.HireGoalName</td>
          <td>@Html.FormatString(i.ActivityValue.ToString(), i.DataTypeId)</td>
          <td>@Html.FormatString(i.GoalValue.ToString(), i.DataTypeId)</td>
       </tr>
    }

由于某种原因,从我的助手出来的字符串永远不会格式化。无论我传入的任何未格式化的号码都会被传回。我不确定我做错了什么或错过了什么。

辅助方法:

public static MvcHtmlString FormatString(this HtmlHelper helper, string stringToFormat, int format)
        {
            if (format == 3)
            {
                return MvcHtmlString.Create(String.Format("{0:C0}", stringToFormat));      
            }
            return MvcHtmlString.Create(String.Format("{0:0}", stringToFormat));
        }

我也试过返回一个常规字符串而不是MvcHtmlString以及使用ToString()方法,但都没有帮助。

非常感谢任何帮助/建议。

谢谢, -Tim

1 个答案:

答案 0 :(得分:1)

您的错误是您尝试格式化字符串,而不是数字。 String.Format()只有在您传递号码时才能格式化。所以你只需要将参数从字符串更改为double:

public static MvcHtmlString FormatString(this HtmlHelper helper, double numberToFormat, int format)

并且不要在视图中转换数字:

@Html.FormatString(i.ActivityValue, i.DataTypeId)

如果您不仅有双倍值,还有其他类型(如浮点数或小数),您可以使用object代替double

public static MvcHtmlString FormatString(this HtmlHelper helper, object numberToFormat, int format)