如何利用C#将每个单词的第一个字符或整个string的第一个字符大写?

我可以写我自己的algorithm来做到这一点,但我觉得应该有相当于C#中ruby的人性化 。

我GOOGLE了,但只find方法来人性化date。

例子:

  • 一种将“Lorem Lipsum et”变成“Lorem lipsum et”的方法
  • 一种将“Lorem Lipsum et”变成“Lorem Lipsum Et”的方法

正如在@ miguel答案的评论中所讨论的那样,您可以使用自.NET 1.1以来可用的TextInfo.ToTitleCase 。 这是一些与你的例子相对应的代码:

 string lipsum1 = "Lorem lipsum et"; // Creates a TextInfo based on the "en-US" culture. TextInfo textInfo = new CultureInfo("en-US",false).TextInfo; // Changes a string to titlecase. Console.WriteLine("\"{0}\" to titlecase: {1}", lipsum1, textInfo.ToTitleCase( lipsum1 )); // Will output: "Lorem lipsum et" to titlecase: Lorem Lipsum Et 

如果首字母缩略词在文本中(因此“ NAMBLA ”不会变成“nambla”或“Nambla”),它会忽略所有大写字母,例如“LOREM LIPSUM ET”。

但是,如果你只想大写第一个字符,你可以做解决scheme,在这里 …或者你可以拆分string,并大写第一个在列表中:

 string lipsum2 = "Lorem Lipsum Et"; string lipsum2lower = textInfo.ToLower(lipsum1); string[] lipsum2split = lipsum2lower.Split(' '); bool first = true; foreach (string s in lipsum2split) { if (first) { Console.Write("{0} ", textInfo.ToTitleCase(s)); first = false; } else { Console.Write("{0} ", s); } } // Will output: Lorem lipsum et 

使用正则expression式看起来更清洁:

 string s = "the quick brown fox jumps over the lazy dog"; s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper()); 

如果你只是想大写第一个字符,只要把它放在你自己的实用工具里:

 return string.IsNullOrEmpty(str) ? str : str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant(); 

还有一个图书馆的方法来大写每个单词的第一个字符:

http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

据我所知,没有写代码的方法是没有办法的。 C#网(哈!)你上,下和标题(你有什么)的情况下:

http://support.microsoft.com/kb/312890/EN-US/

在.NET中没有适当的语言资本空间的预先构build的解决scheme。 你想要什么样的capitialization? 你是否遵循芝加哥风格公约手册? AMA还是MLA? 即使简单的英文句子大写也有1000个字的特例。 我不能说ruby的人性化,但我想它可能不符合大写的语言规则,而是做一些更简单的事情。

在内部,我们遇到了同样的问题,不得不写一个相当大的代码来处理适当的(在我们的小世界中)文章标题的框架,甚至不考虑句子大小写。 它确实得到“模糊”:)

这真的取决于你需要什么 – 你为什么要把句子转换为适当的大写(在什么情况下)?

CSS技术是可以的,但只能改变浏览器中string的表示方式。 更好的方法是在发送到浏览器之前使文本本身大写。

上述大多数暗示都没有问题,但是没有一个能够解决如果您需要保留混合大小写的单词,或者想要使用真正的Title Case,会发生什么情况的问题,例如:

“美国在哪里学习PHd课程”

要么

“IRS表格UB40a”

另外使用CultureInfo.CurrentCulture.TextInfo.ToTitleCase(string)保留了大写字母,就像在“体育和MLB棒球”中变成了“体育和MLB棒球”,但是如果整个string被放在大写字母中,则会引起问题。

所以我把一个简单的函数放在一起,让你可以保留大写和混合大小写的单词,并通过将它们包含在一个特殊的case和lowerCasesstring数组中,使小写字母小写(如果它们不在短语的开头和结尾):

 public static string TitleCase(string value) { string titleString = ""; // destination string, this will be returned by function if (!String.IsNullOrEmpty(value)) { string[] lowerCases = new string[12] { "of", "the", "in", "a", "an", "to", "and", "at", "from", "by", "on", "or"}; // list of lower case words that should only be capitalised at start and end of title string[] specialCases = new string[7] { "UK", "USA", "IRS", "UCLA", "PHd", "UB40a", "MSc" }; // list of words that need capitalisation preserved at any point in title string[] words = value.ToLower().Split(' '); bool wordAdded = false; // flag to confirm whether this word appears in special case list int counter = 1; foreach (string s in words) { // check if word appears in lower case list foreach (string lcWord in lowerCases) { if (s.ToLower() == lcWord) { // if lower case word is the first or last word of the title then it still needs capital so skip this bit. if (counter == 0 || counter == words.Length) { break; }; titleString += lcWord; wordAdded = true; break; } } // check if word appears in special case list foreach (string scWord in specialCases) { if (s.ToUpper() == scWord.ToUpper()) { titleString += scWord; wordAdded = true; break; } } if (!wordAdded) { // word does not appear in special cases or lower cases, so capitalise first letter and add to destination string titleString += char.ToUpper(s[0]) + s.Substring(1).ToLower(); } wordAdded = false; if (counter < words.Length) { titleString += " "; //dont forget to add spaces back in again! } counter++; } } return titleString; } 

这只是一个简单而快捷的方法 – 如果你想花更多的时间,可能会有所改进。

如果你想保持较小的词如“a”和“of”的大小写,那就把它们从特殊情况下的string数组中移除。 不同的组织对资本化有不同的规定。

你可以在这个网站上看到这个代码的实例: Egg Donation London – 这个网站通过parsingURL(例如“/ services / uk-egg-bank / introduction”)自动在页面顶部创build面包屑path – 然后每个在path中的文件夹名称已连字符replace为空格,并大写文件夹的名称,所以英国蛋银行成为英国蛋银行。 (保留大写'英国')

此代码的扩展可能是在共享文本文件,数据库表或Web服务中使用缩写词和大写/小写词的查找表,以便混合大小写单词的列表可以从一个地方维护并应用于许多不同的地方依赖于该function的应用程序。

还有一个优雅的解决scheme:

 using System.Globalization; public static string ToTitleCase(this string title) { return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title); } 

祝你有美好的一天 !