如何在c# MVC 4中格式化数字以反映两个小数点的货币

本文关键字:两个 货币 小数点 MVC 数字 格式化 | 更新日期: 2023-09-27 18:10:24

所以我有麻烦,我的视图想要更多的数字后面的小数点作为输入比我想要它需要。

我正在使用这个模型:

public class Movie
{
    public int ID { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    [DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
    public decimal Price { get; set; }
}

这是我的观点:

    <div class="editor-label">
        @Html.LabelFor(model => model.Price)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model =>  model.Price)
        @Html.ValidationMessageFor(model => model.Price)
    </div>

似乎只是添加DisplayFormat属性到Movie。价格不足以让用户输入像2,79这样的数字,如果他们尝试,他们会得到验证错误。@Html创建的输入字段。EditorFor(model => model. price)则要求数字为2,790(注意在小数点后面添加了一个额外的0)。

我已经尝试了各种DataFormatStrings,但都没有效果,我错过了什么/不理解?

我如何调整我的代码,使用户能够输入2,79作为一个有效的输入,而不是2,790?

如何在c# MVC 4中格式化数字以反映两个小数点的货币

这里的问题是服务器——很可能也是客户端验证脚本——将逗号(,)解析为小数分隔符,而不是千位分隔符。这是因为,在默认区域性中,小数点是.。所以1234 + 56/100"通常"表示为1,234.56而不是1.234,56

您需要设置适当的区域性,以便解析在您的格式中正确工作。通过在web中全局设置一个值来实现。如果您需要更细粒度的控制,也可以从控制器手动设置Thread.CurrentThread.CurrentUICulture/Thread.CurrentThread.CurrentCulture

这也很可能不会冒泡到客户端验证,所以你需要确保你写了适当的JavaScript验证规则,以及覆盖默认的。


作为旁注,您可能希望做一些事情来指示您的用户期望使用哪种格式。世界上其他地方的人写数字的方式不同,他们可能希望用自己的原生格式。(有时页面语言可以很好地提示预期的数字/日期格式。)