2013-07-25 32 views
9

Tôi đã gặp một chút vấn đề lạ khi sử dụng WebAPI và JSON.Net. Khi hủy bỏ chuỗi JSON đã được gửi tới API của tôi, tôi dường như đang mất chính xác! Tôi đang gửi số thập phân đến 3 chữ số thập phân, nhưng khi các giá trị vật hoá trong đối tượng của tôi, nó chỉ có 2 chữ số thập phân!WebAPI, JSON.Net và mất độ chính xác thập phân

Các JSON tôi gửi trông như thế này:

{ 
    id: 1, 
    name: 'mock data', 
    value: 123.456 
} 

này được ràng buộc vào một lớp học mà trông giống như sau:

public class MockObject { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Value { get; set; } 
} 

Chỉ cần cho đầy đủ này về cơ bản là những gì phương pháp WebAPI của tôi trông giống như :

public HttpResponseMessage Post (MockObject data) { 
    // do something with the value here and return the relevant response 
} 

Tôi đang gửi dữ liệu qua yêu cầu ajax của JQuery, nhưng tôi có thể xem bài đăng giá trị là chính xác như tôi mong đợi khi kiểm tra các giá trị trong các công cụ chrome dev trước khi gửi và trong fiddler một khi họ đã đi "qua dây".

Khi làm việc gì đó với đối tượng vật chất theo phương pháp Post, giá trị của "Giá trị" là 123,45.

Nếu tôi gửi 2 hoặc ít chữ số thập phân hơn (ví dụ 123.4 hoặc 123.45) giá trị được hủy đăng ký như mong đợi, tuy nhiên nếu tôi gửi nhiều hơn 2 chữ số thập phân (ví dụ 123.456 hoặc 123.4567 v.v. đến 123,45.

Bất cứ ai khác đi qua vấn đề này? gợi ý Bất kỳ?

Trả lời

16

tôi quản lý để sắp xếp này ra.

cuối cùng vấn đề đã được gây ra bởi thực tế rằng nền văn hóa đã được thiết lập mà chứa định dạng số tiền tệ. Định dạng số đơn vị tiền tệ chỉ định số chữ số thập phân sẽ được sử dụng cho các giá trị thập phân.

Để khắc phục điều này bây giờ tôi đặt văn hóa serializer WebAPI JSON để một trường hợp mới của CultureInfo.InvariantCulture trong Global.ascx.cs như vậy:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Culture = new CultureInfo(string.Empty) { 
    NumberFormat = new NumberFormatInfo { 
     CurrencyDecimalDigits = 5 
    } 
}; 

này có nghĩa là giá trị thập phân có thể có bất cứ điều gì lên đến 5 chữ số thập phân.

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