C# 更改显示格式数字小数分隔符
我有以下浮点数:-95.83334 这在我的视图模型中:C# 更改显示格式数字小数分隔符,c#,asp.net-mvc,razor,asp.net-mvc-5,C#,Asp.net Mvc,Razor,Asp.net Mvc 5,我有以下浮点数:-95.83334 这在我的视图模型中: [DisplayFormat(DataFormatString = "{0:#.##}")] public float? mx { get; set; } 这是我的看法 @Html.HiddenFor(model => model.mx) 这是生成的html <input data-val="true" id="mx" name="mx" type="hidden" value="-95,83334"> 这是所
[DisplayFormat(DataFormatString = "{0:#.##}")]
public float? mx { get; set; }
这是我的看法
@Html.HiddenFor(model => model.mx)
这是生成的html
<input data-val="true" id="mx" name="mx" type="hidden" value="-95,83334">
这是所需的html
<input data-val="true" id="mx" name="mx" type="hidden" value="-95.83334">
所以问题是,哪种方法是更改此隐藏输入的十进制分隔符的最佳方法?如果不更改,则在使用
Html.DisplayFor
时,将使用我的项目的其余部分DisplayFormat
。而且,它只用于格式化视图上应该显示的内容。如果要更改十进制数字的格式,通常需要使用不同的区域性
@Html.HiddenFor(model => model.mx.ToString(new CultureInfo("en-us")));
编辑:
对不起,我的回答很简短。我认为如果它能工作的话会很有用,不幸的是,我在你的代码中遗漏了一些重要的东西
您的问题是本地化问题。我猜你的机器运行的是欧洲文化。(刚刚注意到您关于设置为西班牙语的评论)
对于一些基本类型(包括float),ToString()已重载。其中一个重载接受CultureInfo实现的IFormatProvider。通过使用for United States English传递CultureInfo,可以确保使用点而不是逗号作为十进制分隔符
我错过的是mx是float?,它是Nullable的缩写。Nullable不会以相同的方式重载ToString,因此您有两种选择
如果您使用的是C#6,则可以使用null check运算符转换浮点值?回到浮球上。然后可以使用ToString重载:
@Html.HiddenFor(model => model.mx?.ToString(CultureInfo.GetCultureInfo("en-us")));
或者,您可以使用String.Format重载,该重载同时接受格式字符串和IFormatProvider:
@Html.HiddenFor(model => String.Format(CultureInfo.GetCultureInfo("en-us"), "{0:#.##}", model.mx));
我不想建议更改线程的区域性,因为这在您的问题“不改变项目的其余部分”中很突出,我可能错误地认为这意味着您不想更改应用程序中其他组件的格式。更改默认线程区域性可能会产生比预期更大的影响
编辑2:
下面是我尝试使用扩展重载来接受IFormatProvider。这只是一个实验,不应该用于生产。。。我把它包括进来纯粹是为了兴趣
public static class HtmlExtensions
{
public static IHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IFormatProvider formatter)
{
var value = expression.Compile().Invoke(helper.ViewData.Model);
var modelMetadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
var property = typeof(TModel).GetProperty(modelMetadata.PropertyName);
var attribute = property.GetCustomAttributes(typeof(DisplayFormatAttribute), false).SingleOrDefault() as DisplayFormatAttribute;
var displayValue = String.Format(formatter, attribute?.DataFormatString ?? "{0}", value);
TagBuilder tagBuilder = new TagBuilder("input");
tagBuilder.MergeAttribute("type", "hidden");
tagBuilder.MergeAttribute("value", displayValue);
return MvcHtmlString.Create(tagBuilder.ToString());
}
}
最后,这是我的解决方案
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
@Html.HiddenFor(model => model.mx)
添加行
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
在我解决问题之前。谢谢你的想法和指导 如果您希望全局更改,您可以强制更改线程的
CultureInfo.CurrentCulture
。我猜这里不需要DisplayFormat
属性,它会干扰您的输入值。我尝试了我的it,但我的CurrentCulture很好,为什么?这是一个隐藏的输入,所以你甚至看不到它。然后,因为它与您的服务器文化不匹配,绑定将失败(除非您有自定义的模型绑定器),并且mx
的值将为null
@StephenMuecke,因为我的应用程序使用这些值。对于采用1个参数的字符串,没有覆盖方法,这是一个答案,它根本不是一个好的答案。我编辑以添加适当的上下文。我可以使用CultureInfo.DefaultThreadCurrentCulture=new CultureInfo(“en-US”)代码>打印浮点值,然后使用CultureInfo.DefaultThreadCurrentCulture=new CultureInfo(“es CL”)
再次返回默认区域性。但是,在cshtml中创建此文件只会在该html中生效,并且不会更改项目的其余部分。我尝试使用您的代码@html.HiddenFor(model=>tring.Format(CultureInfo.GetCultureInfo(“en-us”),“{0:#.#####}”,model.mx))代码>我得到了这个错误<代码> LAS PLANTILLASS SOLO PUEDEN USAR CONPROCESSION CANPOS,Acco OO DePosiDeDes。SuffiCijn例外:Las-PultoLalas Soop-PeEDEN-USAR CONPROCENS,CAMPOS,Accoode DePiDeDes,In Nordice de Munrz Duna OnnsioNo.IndiZADOR PuxalZADOR UnPar aMetro。< /代码>我看到HTMLHelPER方法比我猜想的更复杂。我原以为我的本地化知识可以转移到这个问题上,但我显然对MVC的研究不够深入。作为一个实验,我为HtmlHelper方法HiddenFor创建了一个扩展重载,该方法接受一个IFormatProvider,但我不建议使用它,因为我不知道这些提供程序如何工作得足够好,以实现完全功能的覆盖。我有点惊讶微软没有包括这一点,但可能临时设置默认线程区域性是“正确”的解决方案…那么我如何才能更改此隐藏的区域性?我需要在某些情况下打印逗号,在其他情况下打印点,在同一视图中,为隐藏输入更改区域性有什么意义?这没有任何意义。因为我的应用程序文化是es CL,我需要使用点分隔小数而不是逗号。我不能用逗号分隔的小数做数学运算
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");