MVC,C#中的十进制符号问题?

Posted

技术标签:

【中文标题】MVC,C#中的十进制符号问题?【英文标题】:Decimal symbol issue in MVC, C#? 【发布时间】:2015-09-27 13:58:02 【问题描述】:

我正在使用 MVC 5.0 我在配置中设置了文化:

<system.web>
   <globalization uiCulture="fa-IR" culture="fa-IR" />
</system.web>

我有一个模型如下:

public class MyModel

   [DisplayName("NbatPersent")]
   [Range(0, 100)]
   public double NbatPersent get; set; 

MVC 在 View 中显示 NbatPersent 值,例如 22/5,当我想提交表单时,表单验证器会提醒我 The field NbatPersent must be a number.。无法将 22/5 转换为 22.5 如果我输入 22.5 就可以了,但如果属性有一个值,它会将 . 转换为 /

如何将所有数字属性的文化转换为 en-US 以显示像 22.5 而不像 22/5 这样的值。

编辑: 我使用@html.TextBoxFor 显示小数属性,因为用户应该更改它。

【问题讨论】:

试试这个@Html.DisplayFor(x =&gt; x.NbatPersent,string.Format("0:0.00")); 您是否启用了客户端验证。如果是这样,这是jquery.validation.js 的结果。你可以使用jquery.globalize.js 来解决这个问题。并且将22/5 更改为22.5 是没有意义的,因为当您提交表单时它将在服务器上失败,除非您使用自定义ModelBinder @StephenMuecke 我们应该如何使用jquery.globalize.js 看看this article。您也可以在不使用插件的情况下执行此操作(手动更改验证器),稍后我会为该答案添加一个 【参考方案1】:

jquery.validate.js 会导致客户端验证错误,它使用以下内容来验证值(仅允许 . 字符作为小数分隔符。

number: function(value, element) 
    return this.optional(element) || /^-?(?:\d+|\d1,3(?:,\d3)+)(?:\.\d+)?$/.test(value);
,

您可以使用jquery.validate.globalize.js 插件(有关详细信息,请参阅this article),或者您可以添加自己的脚本来修改验证器,例如(在jquery.validate.js 之后包含此)

$.validator.methods.number = function (value, element) 
   return this.optional(element) || $.isNumeric($(element).val().replace('/', '.'));

【讨论】:

旁注:用正确的正则表达式替换$.isNumeric(...) bit 可能会更好。最后一部分是(?:/\d+),但我不知道波斯语的千位分隔符是什么,所以不确定(?:,\d3)+)需要是什么(即用什么代替, 谢谢,但我收到了Uncaught TypeError: Globalize.culture is not a function 错误 您使用的是插件而不是答案中的脚本吗? 实际上,我使用 jquery-globalize nuget 包安装了 Globalize。 blog.icanmakethiswork.io/2012/09/… 我使用了那篇文章并且没有任何问题(但那是大约 2 年前的事了)。我不确定您可能做错了什么,因此您需要使用您尝试过的相关代码提出一个新问题(但仅在我的答案中使用脚本更容易,并且无需使用插件)【参考方案2】:

尝试明确设置视图格式

@Html.DisplayFor(x => string.Format("0:0.00", x.NbatPersent));

否则,您可以为 double 类型编写自定义编辑器模板(~/Views/Shared/EditorTemplates/double.cshtml):

@model double?
@Html.TextBox("", Model.HasValue ? Model.Value.ToString("#,##0.000#") : "")

然后在你看来:

@Html.EditorFor(x => x.NbatPersent)

【讨论】:

我正在使用@Html.TextBoxFor 显示小数属性,因为用户应该更改它。 我认为这不是正确的方法,我认为我们应该更改 MVC 绑定以在所有应用程序中纠正此问题,而无需更改 Helpers。不是吗? @MohammadDayyan 这一切都取决于你的要求......使用属性你可以做到......[DisplayFormat(DataFormatString = "0:#,##0.000# ", ApplyFormatInEditMode = true)] 公共双倍? NbatPersent 得到;放; OP 有一个 input 错误。 EditFor 会抛出异常,not DisplayFor 甚至 @Html.TextBox。事实上,建议的格式 取决于 是否具有正确的文化 - .十进制占位符,它没有指定使用点作为占位符

以上是关于MVC,C#中的十进制符号问题?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# ASP .Net MVC 中编辑十进制模型属性

C# 构建十六进制符号字符串

C#控制台基础 无符号二进制小数转换为十进制

C#控制台基础 无符号八进制小数转换为十进制

C#控制台基础 无符号十六进制小数转换为十进制

NSLog()输出函数集格式字符