[英]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.