更改显示格式编号小数分隔符

时间:2015-11-05 19:10:53

标签: 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">

这是所需的html

<input data-val="true" id="mx" name="mx" type="hidden" value="-95.83334">

所以问题是,哪个是更改此隐藏输入的小数点分隔符的最佳方法?不改变我项目的其余部分

3 个答案:

答案 0 :(得分:2)

使用DisplayFormat时会使用

Html.DisplayFor。并且,它仅用于格式化应该在视图上显示的内容。如果您想要更改一般的十进制数字格式,您需要使用不同的文化。

答案 1 :(得分:0)

@Html.HiddenFor(model => model.mx.ToString(new CultureInfo("en-us")));

编辑: 对不起,简短的回答。我认为如果它起作用会很有用,不幸的是我错过了你代码中重要的东西。

您的问题是本地化问题。我猜你的机器运行的是欧洲文化。 (刚刚注意到你关于将其设置为西班牙语的评论)

ToString()已经为某些基本类型重载,包括float。其中一个重载接受CultureInfo实现的IFormatProvider。通过使用culture code为美国英语传递CultureInfo,您可以确保使用点而不是逗号作为小数点分隔符。

我错过的是mx是一个浮点?,它是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());
    }
}

像这样使用

@Html.HiddenFor(mode => mode.myNumber, System.Globalization.CultureInfo.GetCultureInfo("en-us"))

答案 2 :(得分:0)

最后,这是我的解决方案

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
@Html.HiddenFor(model => model.mx)

添加行

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
在我隐藏之前解决了问题。感谢您的想法和指南!