使用DisplayFor Html Helper格式化为货币

时间:2017-03-13 20:57:21

标签: asp.net-mvc display-templates

我的页面会显示一些货币数据。 我想用货币格式格式化数据,但只使用显示模板。

我有以下代码:

 @foreach (var item in Model.Data)
{
    <tr class="@(item.Group%2==0? "odd-colore": "even-colore")">
    <td>@Html.DisplayFor(modelItem => item.Name)</td>
    <td>@Html.DisplayFor(modelItem => item.Amount1)</td>      
    <td>@Html.DisplayFor(modelItem => item.LName)</td>
    <td>@Html.DisplayFor(modelItem => item.Amount2)</td>
    <td>@Html.DisplayFor(modelItem => item.Amount3)</td>

    </tr>
}   

我创建了一个DisplayTemplate String.cshtml,因为我的数据类型是字符串:

@model string

@{ 
    IFormatProvider formatProvider = new System.Globalization.CultureInfo("en-US");
    <span class="currency">@Model.ToString("C",formatProvider)</span>
}

但是当我运行它时,我收到错误:

  

方法没有超载&#39; ToString&#39;需要2个参数

如何使用DisplayTemplatestring.Format("{0:C}")

将积极金额显示为$ 1000.00,将金额显示为($ 1000.00)

1 个答案:

答案 0 :(得分:0)

您遇到的问题是因为您尝试将string转换为货币。来自MSDN

  

货币(&#34; C&#34;)格式说明符

     

&#34; C&#34; (或货币)格式说明符将数字转换为表示货币金额的字符串

您尝试使用的.ToString(string format, IFormatProvider formatProvider)重载仅适用于数字类型,这就是它无法编译的原因。

举例说明:

public class TestModel
{
    public decimal Amount { get; set; }
    public string StringAmount { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var model = new TestModel
        {
            Amount = 1.99M,
            StringAmount = "1.99"
        };

        IFormatProvider formatProvider = new CultureInfo("en-US");

        // Prints $1.99
        Console.WriteLine(model.Amount.ToString("C", formatProvider));

        // Prints 1.99
        Console.WriteLine(string.Format(formatProvider, "{0:C}", model.StringAmount));
    }
}

所以你有两个选择:

  1. 将数据转换为模板中的数字类型,然后对其进行格式化。
  2. 首先将数据存储为数字类型。
  3. 我相信2是更好的选择,因为你想要处理数字数据,所以将它存储为字符串只会增加计算和格式化的复杂性(正如你在这里看到的那样),因为你和#39;必须首先进行转换。