2011-10-03 21 views
7

Tengo una propiedad de mi modelo que es de tipo doble. Uno de mis artículos tiene un valor de 0.000028, pero cuando se muestra mi vista de edición, el editor de este valor se muestra como 2.8e-005.MVC3 Editor Para la doble notación científica que muestra

Aparte de esto siendo confuso para mis usuarios, sino que también falla la validación mi expresión regular de

[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; } 

¿Cómo consigo este campo para mostrar? Tengo este código (que se muestra a continuación) que renderizará un decimal como quiero, pero no estoy seguro de dónde implementarlo.

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

Utilizo la propiedad NeckDimension en dos lugares, y edito la vista y una vista en pantalla. Aquí se muestra cómo se rinden cada uno.

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

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

ACTUALIZACIÓN Al parecer, el formatSalida no funcionará con TextBoxFor. Intenté cambiar mi @ Html.TextBoxFor a un Html.EditorFor y darle una clase pero falló con la siguiente excepción.

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

Este código antiguo sigue funcionando:

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

Este código le dio la excepción:

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

Parece que mis opciones son solucionar este problema con javascript o fijarlo con un editor de plantillas , pero no tengo tiempo para investigar y aprender la segunda opción en este punto.

SOLUCIÓN:

creé un editor de plantillas para el doble? como sigue.

@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

Me gusta el enfoque de @Darin Dimitrov de usar el decorador DisplayFormat, pero no funciona en mi caso. No estoy seguro si uno de los otros decoradores está tirando esto, pero todavía necesito una solución que funcione. –

Respuesta

7

Se puede decorar la propiedad en su modelo de vista con el atributo [DisplayFormat]:

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

y ahora en sus puntos de vista inflexible simplemente:

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

o si es para la edición :

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

Otra posibilidad si desea aplicar este formato para todos los dobles en su aplicación o por controlador es escribir un custom display/editor template.

+0

He agregado DisplayFormat según su ejemplo pero sigo obteniendo la notación científica. ¿Alguna idea? He agregado mi propiedad en la pregunta con todos los decoradores. –

+0

Debo añadir que el valor 0.000028 con el formato "0: F20" va a devolver 0.00002800000000000000, que tampoco es deseable. Es por eso que mi código en mi ejemplo usa el .TrimEnd ('0'). –

+0

@JeffReddy, no estoy seguro de entender cuál es el problema.Si desea 6 números después del separador decimal, ¿por qué no usa el formato '{0: F6}'? –

Cuestiones relacionadas