2011-10-03 38 views
7

Tôi có một thuộc tính của mô hình của tôi có kiểu gấp đôi. Một trong các mục của tôi có giá trị là 0.000028, nhưng khi chế độ xem chỉnh sửa của tôi được hiển thị, trình chỉnh sửa cho giá trị này hiển thị là 2,8e-005.Trình soạn thảo MVC3 Đối với Double hiển thị ký hiệu khoa học

Bên cạnh này là khó hiểu cho người dùng của tôi, nó cũng không xác nhận biểu hiện thường xuyên của tôi về

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

Làm thế nào để có được lĩnh vực này để hiển thị? Tôi đã có bit này của mã (hiển thị dưới đây) mà sẽ làm cho một số thập phân như tôi muốn, nhưng tôi không chắc chắn nơi để thực hiện nó.

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

Tôi sử dụng thuộc tính NeckDimension ở hai vị trí và chỉnh sửa chế độ xem và chế độ xem hiển thị. Dưới đây là cách chúng được hiển thị.

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

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

CẬP NHẬT Rõ ràng DisplayFormat sẽ không làm việc với TextBoxFor. Tôi đã cố gắng thay đổi @ Html.TextBoxFor thành Html.EditorFor và cấp cho nó một lớp nhưng không thành công với ngoại lệ sau.

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

mã cũ này vẫn hoạt động:

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

Mã này đã đưa ra ngoại lệ:

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

Dường như lựa chọn của tôi là sửa lỗi này với javascript hoặc sửa chữa nó với một mẫu biên tập viên nhưng tôi không có thời gian để nghiên cứu và tìm hiểu tùy chọn thứ 2 vào thời điểm này.

SOLUTION:

Tôi tạo ra một mẫu biên tập viên cho đôi? như sau.

@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

Tôi thích cách tiếp cận của @Darin Dimitrov khi sử dụng trình trang trí DisplayFormat, nhưng nó không hoạt động trong trường hợp của tôi. Tôi không chắc liệu một trong những người trang trí khác có đang ném nó đi không, nhưng tôi vẫn cần một giải pháp hoạt động. –

Trả lời

7

Bạn có thể trang trí bất động sản trên mô hình quan điểm của bạn với [DisplayFormat] thuộc tính:

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

và bây giờ trong quan điểm mạnh mẽ gõ của bạn chỉ đơn giản là:

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

hoặc nếu nó là để chỉnh sửa :

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

Một khả năng khác nếu bạn muốn áp dụng định dạng này cho tất cả các đôi trong ứng dụng của bạn hoặc mỗi bộ điều khiển là viết custom display/editor template.

+0

Tôi đã thêm DisplayFormat theo ví dụ của bạn nhưng tôi vẫn nhận được ký hiệu khoa học. Có suy nghĩ gì không? Tôi đã thêm tài sản của tôi trong câu hỏi với tất cả các trang trí. –

+0

Tôi nên thêm rằng giá trị 0.000028 bằng cách sử dụng định dạng "0: F20" sẽ trả về 0,00282800000000000000, cũng không được mong muốn. Đó là lý do tại sao mã của tôi trong ví dụ của tôi sử dụng .TrimEnd ('0'). –

+0

@JeffReddy, tôi không chắc mình hiểu vấn đề là gì.Nếu bạn muốn 6 số sau dấu tách thập phân tại sao bạn không sử dụng định dạng '{0: F6}'? –

Các vấn đề liên quan