我如何利用C#中的名字和姓氏的首字母大写?

有没有简单的方法来大写字母的第一个字母,并降低其余的呢? 有没有内置的方法,还是我需要做自己的?

TextInfo.ToTitleCase()大写string的每个标记中的第一个字符。
如果不需要维护Acronym Uppercasing,那么应该包含ToLower()

 string s = "JOHN DOE"; s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower()); // Produces "John Doe" 

如果CurrentCulture不可用,请使用:

 string s = "JOHN DOE"; s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower()); 

有关详细说明,请参阅MSDN链接 。

 CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world"); 
 String test = "HELLO HOW ARE YOU"; string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test); 

上面的代码不会工作…..

所以把下面的代码转换成更低的应用函数

 String test = "HELLO HOW ARE YOU"; string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower()); 

有一些CultureInfo.CurrentCulture.TextInfo.ToTitleCase无法处理的情况,例如:撇号'

 string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo"); // input = O'reilly, M'grego, D'angelo 

也可以使用正则expression式 \b[a-zA-Z]来标识单词边界\b之后的单词的起始字符,那么我们只需要用大写等价replace匹配,这要归功于Regex.Replace(string input,string pattern,MatchEvaluator evaluator)方法:

 string input = "o'reilly, m'grego, d'angelo"; input = Regex.Replace(input.ToLower(), @"\b[a-zA-Z]", m => m.Value.ToUpper()); // input = O'Reilly, M'Grego, D'Angelo 

正则expression式可以根据需要进行调整,例如,如果我们想要处理正则expression式变成的MacDonaldMcFry情况: (?<=\b(?:mc|mac)?)[a-zA-Z]

 string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry"; input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z]", m => m.Value.ToUpper()); // input = O'Reilly, M'Grego, D'Angelo, MacDonald'S, McFry 

如果我们需要处理更多的前缀,我们只需要修改组(?:mc|mac) ,例如添加法语前缀du, de (?:mc|mac|du|de)

最后,我们可以认识到,这个正则expression式也将匹配MacDonald'S的情况,所以我们需要在正则expression式中使用负面的后面(?<!'s\b)来处理它。 最后我们有:

 string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry"; input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper()); // input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry 

Mc和Mac是美国各地常用的姓氏前缀,还有其他的。 TextInfo.ToTitleCase不处理这些情况,不应该用于这个目的。 以下是我如何做到这一点:

  public static string ToTitleCase(string str) { string result = str; if (!string.IsNullOrEmpty(str)) { var words = str.Split(' '); for (int index = 0; index < words.Length; index++) { var s = words[index]; if (s.Length > 0) { words[index] = s[0].ToString().ToUpper() + s.Substring(1); } } result = string.Join(" ", words); } return result; } 

ToTitleCase()应该为你工作。

http://support.microsoft.com/kb/312890

最直接的select将是使用.NET中可用的ToTitleCase函数,大多数时候应该关注这个名字。 正如edg所指出的那样,有些名称不适用于这些名称,但这些名称相当罕见,所以除非您将目标locking在这样的名称是常见的文化中,否则您不必担心太多的问题。

但是,如果你不使用.NET语言,那么它取决于input的内容 – 如果你有两个单独的字段的名字和姓氏,那么你可以只是大写的第一个字母降低其余的使用子。

 firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower(); lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower(); 

但是,如果您提供了多个名称作为同一string的一部分,那么您需要知道如何获取信息并相应地进行拆分 。 所以,如果你得到一个像“John Doe”这样的名字,你可以根据空格字符来分割string。 如果是“Doe,John”这样的格式,你将需要根据逗号分割它。 但是,一旦你把它分开,你只需要应用前面显示的代码。

CultureInfo.CurrentCulture.TextInfo.ToTitleCase(“my name”);

返回〜我的名字

但是如前所述,McFly这样的名字依然存在。

我用我自己的方法来解决这个问题:

例如短语:“hello world。hello this is the stackoverflow world”。 将是“Hello World。你好,这是Stackoverflow世界”。 正则expression式\ b(单词的开始)\ w(单词的第一个字符)将会执行这个技巧。

 /// <summary> /// Makes each first letter of a word uppercase. The rest will be lowercase /// </summary> /// <param name="Phrase"></param> /// <returns></returns> public static string FormatWordsWithFirstCapital(string Phrase) { MatchCollection Matches = Regex.Matches(Phrase, "\\b\\w"); Phrase = Phrase.ToLower(); foreach (Match Match in Matches) Phrase = Phrase.Remove(Match.Index, 1).Insert(Match.Index, Match.Value.ToUpper()); return Phrase; } 

使用ToTitleCase的build议不适用于全部大写的string。 所以你必须在第一个字符上调用ToUpper,在剩下的字符上调用ToLower。

这个class有诀窍。 你可以添加新的前缀到_prefixes静态string数组。

 public static class StringExtensions { public static string ToProperCase( this string original ) { if( String.IsNullOrEmpty( original ) ) return original; string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord ); return result; } public static string WordToProperCase( this string word ) { if( String.IsNullOrEmpty( word ) ) return word; if( word.Length > 1 ) return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 ); return word.ToUpper( CultureInfo.CurrentCulture ); } private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" ); private static readonly string[] _prefixes = { "mc" }; private static string HandleWord( Match m ) { string word = m.Groups[1].Value; foreach( string prefix in _prefixes ) { if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) ) return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase(); } return word.WordToProperCase(); } } 

如果您使用vS2k8,则可以使用扩展方法将其添加到String类中:

 public static string FirstLetterToUpper(this String input) { return input = input.Substring(0, 1).ToUpper() + input.Substring(1, input.Length - 1); } 

为了解决一些突出显示的问题/问题,我build议先将string转换为小写,然后调用ToTitleCase方法。 然后,您可以使用IndexOf(“Mc”)或IndexOf(“O \”)来确定需要更加特别关注的特殊情况。

 inputString = inputString.ToLower(); inputString = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(inputString); int indexOfMc = inputString.IndexOf(" Mc"); if(indexOfMc > 0) { inputString.Substring(0, indexOfMc + 3) + inputString[indexOfMc + 3].ToString().ToUpper() + inputString.Substring(indexOfMc + 4); } 

我喜欢这种方式:

 using System.Globalization; ... TextInfo myTi = new CultureInfo("en-Us",false).TextInfo; string raw = "THIS IS ALL CAPS"; string firstCapOnly = myTi.ToTitleCase(raw.ToLower()); 

从这个MSDN文章中解除。

希望这可以帮助你。

 String fName = "firstname"; String lName = "lastname"; String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName); String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName); 
  public static string ConvertToCaptilize(string input) { if (!string.IsNullOrEmpty(input)) { string[] arrUserInput = input.Split(' '); // Initialize a string builder object for the output StringBuilder sbOutPut = new StringBuilder(); // Loop thru each character in the string array foreach (string str in arrUserInput) { if (!string.IsNullOrEmpty(str)) { var charArray = str.ToCharArray(); int k = 0; foreach (var cr in charArray) { char c; c = k == 0 ? char.ToUpper(cr) : char.ToLower(cr); sbOutPut.Append(c); k++; } } sbOutPut.Append(" "); } return sbOutPut.ToString(); } return string.Empty; } 

像edg指出的,你需要一个更复杂的algorithm来处理特殊的名字(这可能是为什么很多地方强制所有的大写)。

像这样的未经testing的c#应该处理您请求的简单情况:

 public string SentenceCase(string input) { return input(0, 1).ToUpper + input.Substring(1).ToLower; }