2012-08-24 11 views
9

string.Format đã sau chữ ký phương phápLàm thế nào để xác định dạng cho phương pháp string.Format

string.Format(format, params, .., .. , ..); 

Tôi muốn vượt qua tùy chỉnh định dạng mỗi lần như

string custFormat = "Hi {0} ... {n} "; // I only care about numbers here, and want avoid {abdb} 
string name = "Foo"; 

string message = ProcessMessage(custFormat, name); 

public string ProcessMessage(custFormat, name) 
{ 
    return string.Format(custFormat, name); 
} 

Tôi muốn xác nhận giá trị trong custFormat trước khi chuyển đến ProcessMessage để tránh ngoại lệ.

+3

Ngôn ngữ nào được bạn làm việc tại? C#? –

+0

Bạn nên gắn thẻ câu hỏi này bằng ngôn ngữ lập trình mà bạn đang tìm kiếm câu trả lời. – chucksmash

+0

yes C# string.format – codeSetter

Trả lời

18

Hãy suy nghĩ về API này, nếu có. Mục tiêu là xác thực trước một chuỗi định dạng, để đảm bảo String.Format sẽ không ném.

Lưu ý rằng bất kỳ chuỗi nào không chứa khe định dạng hợp lệ là chuỗi định dạng hợp lệ - nếu bạn không cố chèn bất kỳ thay thế nào.

-> Vì vậy, chúng tôi sẽ cần phải vượt qua trong số điện thoại hoặc args chúng tôi hy vọng để thay thế

Lưu ý rằng có tấn của các mô hình định dạng đặc sản khác nhau, đều có một ý nghĩa đặc biệt đối với các loại cụ thể: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

Mặc dù có vẻ như String.Format sẽ không ném nếu bạn vượt qua một chuỗi định dạng không khớp với loại đối số của bạn, trình định dạng trở nên vô nghĩa trong các trường hợp như vậy. ví dụ. String.Format("{0:0000}", "foo")

-> Vì vậy, một API như vậy sẽ thực sự hữu ích chỉ khi bạn cũng chuyển các loại args.

Nếu chúng ta cần chuyển chuỗi định dạng và một loạt các loại (ít nhất), thì về cơ bản chúng tôi có chữ ký là String.Format, vậy tại sao không chỉ sử dụng và xử lý ngoại lệ? Nó sẽ là tốt đẹp nếu một cái gì đó như String.TryFormat tồn tại, nhưng với kiến ​​thức của tôi nó không.

Đồng thời, xác thực trước qua một số API, sau đó xác thực lại chính xác trong số String.Format không phải là lý tưởng hoàn hảo.

Tôi nghĩ rằng giải pháp sạch nhất có thể để xác định một wrapper:

public static bool TryFormat(string format, out string result, params Object[] args) 
{ 
    try 
    { 
     result = String.Format(format, args); 
     return true; 
    } 
    catch(FormatException) 
    { 
     return false; 
    } 
} 
-1

Bạn nên sử dụng cụm từ thông dụng để kiểm tra cú pháp và bạn cũng có thể sử dụng một số kiểm tra ngữ nghĩa.

biểu hiện thường xuyên nên là: (*{\d+}*)+

+0

Tôi nghĩ rằng điều này có ý nghĩa. Tôi sẽ thử nó ngay bây giờ. Cảm ơn bạn đã giúp đỡ. – codeSetter

+2

Điều này thậm chí không gần. Đầu tiên, có rất nhiều mẫu định dạng hợp lệ khác nhau có thể có (http://msdn.microsoft.com/en-us/library/system.string.format.aspx) và điều này chỉ chụp rất đơn giản. Thứ hai, nó không xem xét số lượng hoặc đối số được thay thế ở tất cả - ví dụ: String.Format ("{0} {15}", "test") sẽ vượt qua mẫu này nhưng ném. – latkin

0

Chừng nào bạn chỉ đi qua trong 1 đối số, bạn có thể tìm kiếm custFormat cho {0}. Nếu bạn không tìm thấy nó, nó không hợp lệ.

+0

một arg là chỉ để chứng minh ở đây. – codeSetter

+2

'{}' không phải là mẫu định dạng hợp lệ duy nhất. Có rất nhiều mẫu hợp lệ. ví dụ. '{0: 0000}', '{0: D}', v.v. – latkin

+0

Điểm tốt, tôi chỉ sử dụng mẫu rất đơn giản của mình để cung cấp câu trả lời đơn giản mà tôi cho là. – Thelonias

0

Bạn có thể xác thực bằng thử bắt, nếu định dạng ném ngoại trừ bạn đăng nhập thông tin và ngừng điều trị.

try 
{ 
    string.Format(custFormat, params, .., .. , ..); 
} 
catch(FormatException ex) 
{ 
    throw ex; 
} 

string message = ProcessMessage(custFormat, name);