2009-12-21 67 views
82

Tôi có một chuỗi văn bản (khoảng 5-6 từ chủ yếu) mà tôi cần chuyển đổi.Chuyển đổi tất cả chữ cái đầu tiên thành chữ thường, phần còn lại thấp hơn cho mỗi từ

Hiện nay các văn bản trông giống như:

THIS IS MY TEXT RIGHT NOW 

Tôi muốn chuyển nó sang:

This Is My Text Right Now 

tôi có thể lặp qua bộ sưu tập của tôi về chuỗi, nhưng không chắc chắn làm thế nào để đi về việc thực hiện văn bản này sửa đổi.

Trả lời

208
string s = "THIS IS MY TEXT RIGHT NOW"; 

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower()); 
+2

wow, tôi sẽ không ahve đoán một điều đó! – mrblah

+0

Tuyệt vời! Không bao giờ biết về điều đó. – GrayWizardx

+20

Haha, thật sao? Đó là nơi nó được? Tôi yêu .NET nhưng một số nhà thiết kế API là những người giật thực sự. –

14

Có một số cách để chuyển đổi char đầu tiên của chuỗi thành chữ hoa.

Cách đầu tiên là tạo ra một phương pháp mà chỉ đơn giản mũ char đầu tiên và gắn thêm phần còn lại của chuỗi bằng một chuỗi con:

public string UppercaseFirst(string s) 
    { 
     return char.ToUpper(s[0]) + s.Substring(1); 
    } 

Cách thứ hai (mà là nhanh hơn một chút) là để chia chuỗi thành một mảng char và sau đó tái xây dựng chuỗi:

public string UppercaseFirst(string s) 
    { 
     char[] a = s.ToCharArray(); 
     a[0] = char.ToUpper(a[0]); 
     return new string(a); 
    } 
+1

Giải pháp này không trả lời chính xác câu hỏi đầy đủ. Tiêu đề của câu hỏi là "Chuyển đổi tất cả chữ cái đầu tiên thành chữ hoa, viết hoa còn lại cho mỗi từ". Tuy nhiên, giải pháp này chỉ viết hoa chữ cái đầu tiên của toàn bộ chuỗi. Do đó, giải pháp này sẽ chuyển đổi "hello world" thành "Hello world", thay vì "Hello World". – brsfan

2

tôi không biết nếu giải pháp dưới đây là nhiều hơn hoặc kém hiệu quả hơn so với câu trả lời jspcal, nhưng tôi khá chắc chắn nó đòi hỏi sự sáng tạo đối tượng ít hơn Jamie và của George.

string s = "THIS IS MY TEXT RIGHT NOW"; 
StringBuilder sb = new StringBuilder(s.Length); 
bool capitalize = true; 
foreach (char c in s) { 
    sb.Append(capitalize ? Char.ToUpper(c) : Char.ToLower(c)); 
    capitalize = !Char.IsLetter(c); 
} 
return sb.ToString(); 
+1

Nếu chúng ta quan tâm đến việc tạo đối tượng, tại sao không làm điều đó tại chỗ với một vòng lặp for lập chỉ mục trên s thay vì sử dụng một StringBuilder? – jball

+3

Chuỗi không thay đổi. – ephemient

8

chưa được kiểm tra nhưng một cái gì đó như thế này nên làm việc:

var phrase = "THIS IS MY TEXT RIGHT NOW"; 
var rx = new System.Text.RegularExpressions.Regex(@"(?<=\w)\w"); 
var newString = rx.Replace(phrase,new MatchEvaluator(m=>m.Value.ToLowerInvariant())); 

Về cơ bản nó nói "phôi một trận đấu regex trên tất cả các lần xuất hiện của một nhân vật tự chữ và số mà sau một nhân vật tự chữ và số và sau đó thay thế bằng một phiên bản chữ thường của chính nó"

+0

Đây chính xác là những gì tôi đã tìm kiếm, cảm ơn bạn! –

68

tôi có lẽ thích để gọi ToTitleCase từ CultureInfo (S ystem.Globalization) so với Thread.currentThread (System.Threading)

string s = "THIS IS MY TEXT RIGHT NOW"; 
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower()); 

nhưng nó phải là giống như giải pháp jspcal

EDIT

Trên thực tế những giải pháp không giống nhau: CurrentThread --calls ->CultureInfo!


System.Threading.Thread.CurrentThread.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW"; 
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower()); 

IL_0000: ldstr  "THIS IS MY TEXT RIGHT NOW" 
IL_0005: stloc.0  // s 
IL_0006: call  System.Threading.Thread.get_CurrentThread 
IL_000B: callvirt System.Threading.Thread.get_CurrentCulture 
IL_0010: callvirt System.Globalization.CultureInfo.get_TextInfo 
IL_0015: ldloc.0  // s 
IL_0016: callvirt System.String.ToLower 
IL_001B: callvirt System.Globalization.TextInfo.ToTitleCase 
IL_0020: stloc.0  // s 

System.Globalization.CultureInfo.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW"; 
s = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower()); 

IL_0000: ldstr  "THIS IS MY TEXT RIGHT NOW" 
IL_0005: stloc.0  // s 
IL_0006: call  System.Globalization.CultureInfo.get_CurrentCulture 
IL_000B: callvirt System.Globalization.CultureInfo.get_TextInfo 
IL_0010: ldloc.0  // s 
IL_0011: callvirt System.String.ToLower 
IL_0016: callvirt System.Globalization.TextInfo.ToTitleCase 
IL_001B: stloc.0  // s 

Tài liệu tham khảo:

6

Khi xây dựng tốc độ bảng lớn là một mối quan tâm nên chức năng thứ hai Jamie Dixon là tốt nhất, nhưng nó doesn 't hoàn toàn làm việc như là ...

Nó không mất tất cả các chữ cái thành chữ thường, và nó chỉ viết hoa chữ cái đầu tiên của chuỗi, không phải là chữ cái đầu tiên của mỗi từ trong chuỗi ... tuỳ chọn bên dưới sửa chữa tất cả các vấn đề:

public string UppercaseFirstEach(string s) 
    { 
     char[] a = s.ToLower().ToCharArray(); 

     for (int i = 0; i < a.Count(); i++) 
     { 
      a[i] = i == 0 || a[i-1] == ' ' ? char.ToUpper(a[i]) : a[i]; 

     } 

     return new string(a); 
    } 

Mặc dù tại thời điểm này, cho dù đây vẫn là tùy chọn nhanh nhất là không chắc chắn, giải pháp Regex do George Mauer cung cấp có thể nhanh hơn ... một người quan tâm đủ nên kiểm tra nó.

+2

nó hoạt động, nhưng tôi đã thay đổi "a.Count()" thành a.Length – Christian

8

Nếu bạn đang sử dụng trên một trang web, bạn cũng có thể sử dụng CSS:

style="text-transform:capitalize;"

+1

Tại sao chọn CSS? Khi câu hỏi được yêu cầu cho ** C# asp.net regex ** – Jay

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