繁体   English   中英

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

[英]Change display format number decimal separator

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

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

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

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

编辑:对不起,简短的回答。 我认为如果它有效的话会很有用,不幸的是我错过了你代码中的一些重要内容。

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

ToString() 已为一些基本类型重载,包括 float。 这些重载之一接受 CultureInfo 实现的 IFormatProvider。 通过使用美国英语的文化代码传递 CultureInfo,您可以确保将使用点而不是逗号作为小数点分隔符。

我错过的是 mx 是一个浮点数?,它是 Nullable 的缩写。 Nullable 不会以相同的方式重载 ToString,因此您有几种选择。

如果您使用的是 C#6,您可以使用空检查运算符来转换您的浮点数吗? 回到浮动。 然后您可以使用 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"))

最后,这是我的解决方案

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

添加行

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");

在我的隐藏解决问题之前。 感谢您的想法和指导!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM