2011-10-03 18 views
7

私はdouble型のモデルのプロパティを持っています。私のアイテムの1つは0.000028ですが、編集ビューをレンダリングすると、この値のエディタは2.8e-005と表示されます。MVC3エディターの倍精度浮動小数点型の表記

さておき、これは私のユーザーに混乱を招くことから、それはまた、私はこのフィールドを表示するために取得するにはどうすればよい

[Display(Name = "Neck Dimension")] 
    [RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "Neck Dimension must be a Number")] 
    [Range(0, 9999.99, ErrorMessage = "Value must be between 0 - 9,999.99")] 
    [Required(ErrorMessage = "The Neck Dimension is required.")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F20}")] 
    public double? NeckDimension { get; set; } 

の私の正規表現の検証が失敗しましたか?私は、私が望むように小数点をレンダリングするこのコード(下記)を持っていますが、実装する場所がわかりません。

var dbltest = 0.000028D; 
Console.WriteLine(String.Format("{0:F20}", dbltest).TrimEnd('0')); 

NeckDimensionプロパティを2か所で使用し、編集ビューと表示ビューを使用します。それぞれのレンダリング方法を以下に示します。

@Html.TextBoxFor(model => model.NeckDimension, new { style = "width:75px;" }) 

@Html.DisplayFor(model => model.NeckHDimension) 

UPDATE どうやらdisplayFormatにはTextBoxForでは動作しません。私は@ Html.TextBoxForをHtml.EditorForに変更しようとしましたが、それにクラスを与えましたが、次の例外で失敗しました。

The model item passed into the dictionary is of type 'System.Double', but this dictionary requires a model item of type 'System.String' 

この古いコードはまだ動作します:

@Html.EditorFor(model => model.NeckDimension, new {@class = "formatteddecimal"}) 

それは私のオプションはJavaScriptを使用してこの問題を解決するか、エディタのテンプレートで固定されているように見えます:

@Html.TextBoxFor(model => model.NeckDimension, new { style = "width:75px;" }) 

このコードは例外を与えましたしかし、私はこの時点で第2の選択肢を研究して学ぶ時間がありません。

SOLUTION:

私は、二重のエディタのテンプレートを作成しましたか?次のように。

@model double? 
@{ 
    var ti = ViewData.TemplateInfo; 
    var displayValue = string.Empty; 
    if (Model.HasValue) { 
     displayValue = String.Format("{0:F20}", @Model.Value).TrimEnd('0'); 
    } 
    <input id="@ti.GetFullHtmlFieldId(string.Empty)" name="@ti.GetFullHtmlFieldName(string.Empty)" type="text" value="@displayValue" /> 
} 
+0

DisplayFormatデコレータを使用する@Darin Dimitrovのアプローチが好きですが、私の場合は動作しません。私は、他のデコレータの1つがこれを投げているかどうかはわかりませんが、まだ解決できる解決策が必要です。 –

答えて

7

あなたは[DisplayFormat]属性を使用してビューモデルのプロパティを飾ることができます:単にあなたの強く型付けされたビューで

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F20}")] 
public double Foo { get; set; } 

となりました:

@Html.DisplayFor(x => x.Foo) 

またはそれが編集のためであれば:

@Html.EditorFor(x => x.Foo) 

アプリケーションまたはコントローラごとにすべてのダブルにこのフォーマットを適用する場合は、custom display/editor templateと書くこともできます。

+0

私はあなたの例に従ってDisplayFormatを追加しましたが、私はまだ科学記法を取得しています。何かご意見は?私はすべてのデコレータで質問に自分のプロパティを追加しました。 –

+0

私は、 "0:F20"のフォーマットを使用して0.000028の値が0.00002800000000000000を返すことになりますが、これも望ましくありません。だからこそ、私の例のコードは.TrimEnd( '0')を使用しています。 –

+0

@JeffReddy、私は問題が何であるか分かりません。小数点区切り文字の後ろに6つの数字が必要な場合、 '{0:F6}'形式を使用してください。 –

関連する問題