2009-12-21 99 views
82

我有一個文本字符串(約5-6字居多),我需要轉換。轉換所有首字母大寫,休息下每個字

目前文本的樣子:

THIS IS MY TEXT RIGHT NOW 

我想將其轉換爲:

This Is My Text Right Now 

我可以通過我的收藏琴絃的循環,但不知道如何去執行這一文本修改。

回答

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

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

哇,我不會ahve猜到那一個! – mrblah

+0

太棒了!從來不知道這一點。 – GrayWizardx

+20

哈哈,真的嗎?那是它的地方?我喜歡.NET,但一些API設計師是真正的混蛋。 –

14

有幾種方法可以將字符串的第一個字符轉換爲大寫。

第一種方式是創建一個簡單帽的第一個字符,並且使用子串追加字符串的其餘部分的方法:

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

第二種方法(這是稍快)被分裂串成字符數組,然後重新編譯字符串:

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

此解決方案不能完全正確回答問題。問題的標題是「將所有的第一個字母轉換爲大寫字母,每個字都要低一些」。但是,此解決方案僅將整個字符串的首字母大寫。因此,這個解決方案會將「hello world」轉換爲「Hello world」,而不是「Hello World」。 – brsfan

2

我不知道,如果下面的解決方案比jspcal的回答或多或少的效率,但我敢肯定它需要創建對象比Jamie的少和喬治的。

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

如果我們關心對象的創建,爲什麼不用for循環索引來代替使用StringBuilder? – jball

+3

字符串是不可變的。 – ephemient

8

未經測試,但這樣的事情應該工作:

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())); 

本質上,它說:「在後面的另一個字母數字字符的字母數字字符的所有實例大跳正則表達式匹配,然後用小寫版本來替換它本身」

+0

這正是我一直在尋找的,謝謝! –

68

我可能更喜歡從調用ToTitleCase的CultureInfo小號ystem.Globalization)比Thread.CurrentThread的System.Threading

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

但它應該是一樣jspcal解決

編輯

其實這些解決方案是不一樣的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 

參考文獻:

6

在構建大表的速度是一個問題所以傑米·狄克遜的第二個功能是最好的,但它不完全按照原樣工作...

它沒有把所有的字母爲小寫,並且它只有大寫的字符串,而不是字符串中的每個單詞的第一個字母的第一個字母...下面的選項解決兩個問題:

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); 
    } 

雖然在這一點上,這是否仍是最快的選擇是不確定的,由喬治·莫爾所提供的解決方案Regex可能會更快......別人誰關心不夠應該對它進行測試。

+2

它的工作原理,但我把這個「a.Count()」改爲a.Length – Christian

8

如果您使用在網頁上,你也可以使用CSS:

style="text-transform:capitalize;"

+1

爲什麼選擇CSS? 當問題是要求** c#asp.net正則表達式** – Jay