Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改显示格式数字小数分隔符_C#_Asp.net Mvc_Razor_Asp.net Mvc 5 - Fatal编程技术网

C# 更改显示格式数字小数分隔符

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"> 这是所

我有以下浮点数:-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");