簡體   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