2009-05-26 78 views
48

我可以写我自己的算法来做到这一点,但我觉得应该有相当于C#中的ruby's humanize如何用C#将每个单词的第一个字符或整个字符串的第一个字符大写?

我搜索了它,但只找到方法来人性化日期。

实例:

  • 开启 “的Lorem Lipsum的Et” 到 “的Lorem lipsum等”
  • 开启 “的Lorem lipsum等” 到 “的Lorem Lipsum Et” 是
+1

我喜欢说Lorem Lipsum出于某种原因^^ – marcgg 2009-05-26 22:45:47

+3

总是有正则表达式! string strToCap = strSource.ToLower(); Regex rCapitalize = new Regex(“(?<= [!\。?] \ s +)[A-Za-z]”); strToCap = rCapitalize.Replace(strToCap,m => {return m.Value.ToUpper();}); ...但你会有两个问题。:) – rijipooh 2009-05-26 23:07:27

+3

由于接受的答案链接到与原始问题相反的代码,因此我编辑了问题以询问两个方向,希望这个问题对于未来的用户不会完全混淆。偶然发现。 – 2009-05-27 06:27:42

回答

90

正如在@miguel's answer的评论中所讨论的那样,您可以使用自.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 

,而忽略外壳东西都是全部大写,如“LOREM LIPSUM ET”,因为它走的情况下照顾,如果首字母缩写词是在文本文件(让“NAMBLA”将不会成为“nambla”或“Nambla”)。

但是,如果你只是想利用的第一个字符,你可以做的解决方案,在here ...或者你可以只拆分字符串,并利用该列表中的第一个:

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 
2
一种方法的一种方式

如果你只是想利用的第一个字符,只要坚持这自己的实用方法:

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

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

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

+0

这只会给你标题案例:“Lorem Ipsum Et”,而不是句子:“Lorem ipsum et”,对吗? – vinny 2009-05-26 22:36:46

0

有在.NET语言正确不captialization预置的解决方案。你想要什么样的资本化?你是否遵循芝加哥风格公约手册? AMA还是MLA?即使简单的英语句子大写也有1000个字的特殊例外。我不能说红宝石的人性化做什么,但我想它可能不符合大写的语言规则,而是做更简单的事情。

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

这真的取决于你需要什么 - 为什么你想把句子转换成合适的大写(以及在什么情况下)?

0

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

上述大部分implimentations的都OK,但它们都没有解决,如果你已经混了需要保留,或者如果你想使用真正的标题案例,例如情况下的话会发生什么问题:

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

“IRS表UB40a”

另外使用CultureInfo.CurrentCulture.TextInfo.ToTitleCase(字符串)保留大写单词作为 “体育和MLB棒球”变成“体育和MLB棒球”,但是如果整个字符串被放在大写字母,那么这导致问题。

因此,我将一个简单的函数放在一起,使您可以保留大写和混合大小写的单词,并通过将它们包含在特殊案例和较小案例中来制作小写字母小写字母(如果它们不在该短语的开头和结尾处)字符串数组:

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”)的大小写,则只需从特殊案例字符串数组中删除它们即可。不同的组织对资本化有不同的规定。

您可以在此网站上看到此代码的实际操作示例:Egg Donation London - 此网站通过解析网址(例如“/ services/uk-egg-bank/introduction”)自动在网页顶部创建面包屑路径 - 那么路径中的每个文件夹名称都会将连字符替换为空格并将文件夹名称大写,所以uk-egg-bank成为UK Egg Bank。 (保留大写“英国”)

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

19

使用这个正则表达式看起来清爽多了:

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

还有另一种优雅的解决方案:

定义功能ToTitleCase静态类你谟的

using System.Globalization; 

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

然后在项目的任何地方使用它就像一个字符串扩展名:

"have a good day !".ToTitleCase() // "Have A Good Day !" 
相关问题