2012-08-28 28 views
8

Sau khi tạo loại số riêng (thực tế là DoubleDouble), tôi muốn triển khai giao diện IFormattable. Vì vậy, tôi phải bằng cách nào đó phân tích chuỗi định dạng.Hỗ trợ ToString (định dạng chuỗi) với kiểu số tùy chỉnh

public string ToString(string format, IFormatProvider formatProvider) { 
    // formatting string according to format and using formatprovider? 
    return formattedString; 
} 

Người dùng của lớp sẽ có thể sử dụng nó thay thế cho double (hoặc bất kỳ định dạng số nào khác).

String.Format("{0:0.##}", (DoubleDouble)123.4567); 

Câu hỏi của tôi là, có ai biết hướng dẫn hay về điều này hoặc có thể cho tôi một số gợi ý không? Làm thế nào để hỗ trợ bản địa hóa trong quá trình này?

Làm cách nào để phân tích chuỗi định dạng? Có một số phương pháp để hỗ trợ trong nhiệm vụ này hay tôi phải làm tất cả bằng cách "tay" với regexp và như vậy?

Tôi thực sự đã tìm kiếm trợ giúp nhưng không thể tìm thấy bất kỳ điều gì, nếu bạn tìm thấy thứ gì đó bằng ngôn ngữ khác (C, C++) có thể hữu ích, hãy cho tôi biết về điều đó.

+1

Tôi bắt đầu với các chuỗi chuẩn trước khi tôi bắt đầu với sự đa dạng tùy chỉnh. Còn nội địa hóa thì sao? http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx – Jodrell

+0

Tôi thấy điều này khá hữu ích - http://codebetter.com/davidhayden/2006/03/12/open-closed-principle-iformattable- iformatprovider-icustomformatter/ –

+0

Tôi đã có phương thức ToString trả về một ký pháp khoa học. Vấn đề tôi phải đối mặt là, làm thế nào để phân tích một chuỗi định dạng và trả về một số tương ứng. Liên kết đã cho chỉ sử dụng các công cụ sửa đổi rất cơ bản. –

Trả lời

0

Làm cách nào để hỗ trợ bản địa hóa trong quá trình này?

Something như sau:

public string ToString(string format, IFormatProvider formatProvider) 
{ 
    CultureInfo culture = formatProvider as CultureInfo; 
    if (culture != null) 
    { 
    // Now you can do things like 
    // culture.NumberFormat.NumberDecimalSeparator, etc. 
    } 
} 

Làm thế nào để phân tích chuỗi định dạng? Có một số phương pháp để hỗ trợ trong nhiệm vụ này hay tôi phải làm tất cả bằng "tay" với regexp và như vậy?

Không có API công khai trong khuôn khổ .NET để làm điều đó cho bạn. Nếu bạn nhìn vào số source đối với các kiểu số nguyên .NET. Thực hiện IFormattable, tất cả chúng đều gọi các phương thức bên ngoài, do đó chúng không cung cấp thông tin chi tiết. Bạn có thể sẽ cần phải sử dụng một cái gì đó như RegEx's để phân tích chuỗi định dạng. Sau đó, bạn có thể chia cho công suất lớn nhất của 10 để tìm ra số đầu ra đầu ra sẽ là gì, trừ đi số đó, sau đó lặp lại cho công suất thấp hơn của 10 cho đến khi bạn đã tạo tất cả các chữ số.

0

Có lẽ điều này có thể giúp bạn:

var my = DoFormat(123.0) 

public static string DoFormat(double myNumber) 
{ 

    var s = string.Format("{0:0.00}", myNumber); 

    if (s.EndsWith("00")) 
    { 
     return ((int)myNumber).ToString(); 
    } 
    else 
    { 
     return s; 
    } 
} 
1

MSDN có nice example của một lớp Temperature mà thực hiện giao diện IFormattable với định dạng tùy chỉnh riêng của mình.

Tôi nghĩ bạn đã biết điều này; dù sao, hôm nay tôi học được rằng nếu lớp DoubleDouble bạn thực hiện giao diện sau đó IFormattable:

String.Format("{0:0.##}", (DoubleDouble)123.4567); 

... sẽ gọi thực hiện ToString(...) lớp của DoubleDouble với định dạng cụ thể "0.##" như tham số đầu tiên, mà tôi nghi ngờ là gần với những gì bạn muốn. Bạn vẫn phải phân tích cú pháp phần đó của định dạng.

Tôi sẽ nguy hiểm khi đoán rằng phần lớn phân tích định dạng được nhúng sâu trong các tệp nhị phân .Net được tối ưu hóa cao, vì vậy bạn không nhận được bất kỳ phương pháp phân tích cú pháp tùy chỉnh ảo nào để trợ giúp.

+0

Ok, tôi vừa nhận ra rằng nhận xét của Nate về câu hỏi ở trên đã liên kết tới một hướng dẫn tuyệt vời. Đoạn cuối cùng của tôi là điều mới duy nhất ở đây. – wardies

0

Tôi đã viết một hàm định dạng số JavaScript cách đây vài năm, bắt chước hầu hết các cách thức phân tích chuỗi định dạng .NET. Nó có thể giúp bạn trong việc viết một phiên bản C# của nó. Ít nhất nó có thể cung cấp cho bạn một điểm khởi đầu.

https://github.com/flamewave/jquery-ui-numeric/blob/master/jquery-ui-numeric.js

Cuộn tất cả các con đường xuống phía dưới với chức năng $ .formatNumber.

Lưu ý: Tôi không còn duy trì chức năng này có lợi cho việc sử dụng thư viện Globalize, cũng có thể cung cấp cho bạn một số thông tin chi tiết về phân tích chuỗi định dạng.

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