2011-08-12 33 views
14
Public Function TitleCase(ByVal strIn As String) 
     Dim result As String = "" 
     Dim culture As New CultureInfo("en", False) 
     Dim tInfo As TextInfo = culture.TextInfo() 
     result = tInfo.ToTitleCase(strIn) 
     Return result 
End Function 

Nếu tôi nhập "TEST" vào hàm ở trên. Đầu ra là "TEST". Lý tưởng nhất là nó sẽ ra "Test".ToTitleCase không hoạt động trên tất cả các chuỗi chữ hoa

Tôi cũng đã thử các đoạn mã từ bài này không có kết quả: Use of ToTitleCase

Trả lời

22

Nếu bộ nhớ phục vụ, ToTitleCase() bao giờ dường như làm việc cho tất cả các chuỗi hoa. Về cơ bản nó đòi hỏi bạn phải chuyển đổi chuỗi thành chữ thường trước khi xử lý.

Từ MSDN:

Nói chung, danh hiệu vỏ chuyển đổi ký tự đầu tiên của một từ để chữ hoa và phần còn lại của các nhân vật thành chữ thường. Tuy nhiên, phương thức này hiện không cung cấp vỏ thích hợp để chuyển đổi một từ mà là chữ hoa hoàn toàn, chẳng hạn như từ viết tắt.

Giải pháp sử dụng (trong C#):

string yourString = "TEST"; 

TextInfo formatter = new CultureInfo("en-US", false).TextInfo;  
formatter.ToTitleCase(yourString.ToLower()); 
+8

Để thêm vào câu trả lời tuyệt vời của bạn, nó cũng đáng chú ý rằng bạn chỉ có thể làm: 'System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase (myString.ToLower());' thay vì tạo nhiều đối tượng. –

+0

Cảm ơn Jamie, điều đó dường như thích một chuỗi dài để đặt vào, và tôi không thể đứng các thanh cuộn trong các khối mã của tôi :) –

2

Cũng String.ToTitleCase() sẽ làm việc cho hầu hết các chuỗi nhưng có một vấn đề với những cái tên như McDonald và O'Brian, và tôi sử dụng CurrentCulture cho các biến thể viết hoa. Đây là một phương pháp mở rộng đơn giản mà sẽ xử lý sau đây:

public string ToProperCase(this string value) 
{ 

    if (string.IsNullOrEmpty(value)) { 
     return ""; 
    } 

    string proper = System.Threading.Thread.CurrentThread.CurrentCulture. 
        TextInfo.ToTitleCase(value.ToLower()); 

    int oddCapIndex = proper.IndexOfAny({ 
     "D'", 
     "O'", 
     "Mc" 
    }); 


    if (oddCapIndex > 0) { 
     // recurse 
     proper = proper.Substring(0, oddCapIndex + 2) + 
       proper.Substring(oddCapIndex + 2).ToProperCase(); 

    } 

    return proper; 

} 

Ngoài ra IndexOfAny (String []) mở rộng:

public int IndexOfAny(this string test, string[] values) 
{ 
    int first = -1; 
    foreach (string item in values) { 
     int i = test.IndexOf(item); 
     if (i > 0) { 
      if (first > 0) { 
       if (i < first) { 
        first = i; 
       } 
      } else { 
       first = i; 
      } 
     } 
    } 
    return first; 
} 
0

Về câu trả lời 1, đó là một ý tưởng tốt đẹp nhưng mã không biên dịch; và, khi sửa chữa cú pháp, nó không hoạt động. Tôi không có thời gian để gỡ lỗi nhưng bạn sẽ cần phải nếu bạn muốn sử dụng nó. Một phần của vấn đề là chỉ số giả định các chỉ mục dựa trên 1 nhưng chúng là 0 dựa trên C#. Cũng có những vấn đề khác.

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