如何在C#中将名字和姓氏的首字母大写?

时间:2008-09-16 14:21:37

标签: c# string capitalize

是否有一种简单的方法可以将字符串的第一个字母大写并降低其余部分?是否有内置方法或我需要自己制作?

17 个答案:

答案 0 :(得分:256)

TextInfo.ToTitleCase()将字符串的每个标记中的第一个字符大写 如果不需要维护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 Link

答案 1 :(得分:117)

CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");

答案 2 :(得分:30)

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

以上代码无效.....

所以把下面的代码转换为lower然后应用函数

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

答案 3 :(得分:12)

在某些情况下CultureInfo.CurrentCulture.TextInfo.ToTitleCase无法处理,例如:撇号'

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

还可以使用正则表达式 \b[a-zA-Z]来识别单词边界\b之后的单词的起始字符,然后我们只需要将其匹配替换为案例等效归功于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

如果需要,可以调整正则表达式,例如,如果我们要处理正则表达式变为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)

最后,我们可以意识到这个正则表达式也会匹配最后一个MacDonald'S的{​​{1}}个案,所以我们需要在正则表达式中处理它负面看's。最后我们有:

(?<!'s\b)

答案 4 :(得分:7)

麦克和麦克是整个美国常见的姓氏前缀,还有其他人。 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;
    }

答案 5 :(得分:5)

ToTitleCase()应该适合你。

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

答案 6 :(得分:4)

最直接的选择是使用.NET中可用的ToTitleCase函数,它应该在大多数时候处理名称。正如edg指出的那样,有一些名称不适用,但这些名称相当罕见,所以除非你的目标是这种名称很常见的文化,否则你不必担心太多。

但是,如果您不使用.NET语言,那么它取决于输入的内容 - 如果您有第一个名称和姓氏的两个单独字段,那么您可以将第一个字母大写为其他字母它使用子串。

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

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

答案 7 :(得分:3)

CultureInfo.CurrentCulture.TextInfo.ToTitleCase(“我的名字”);

返回〜我的名字

但问题仍然存在于像前面所述的McFly这样的名字。

答案 8 :(得分:3)

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

例如短语:“hello world。你好,这是stackoverflow世界。”将是“Hello World。你好,这是Stackoverflow世界。”正则表达式\ 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;
}

答案 9 :(得分:2)

使用ToTitleCase的建议不适用于全部大写的字符串。因此,您必须在第一个字符上调用ToUpper,在剩余字符上调用ToLower。

答案 10 :(得分:2)

这个类可以解决这个问题。您可以为 _prefixes 静态字符串数组添加新前缀。

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

答案 11 :(得分:1)

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

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

答案 12 :(得分:0)

为了解决一些突出显示的问题/问题,我建议先将字符串转换为小写,然后调用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);
}

答案 13 :(得分:0)

我喜欢这样:

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

取消MSDN article

答案 14 :(得分:0)

希望这会对你有所帮助。

String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);

答案 15 :(得分:0)

 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;

        }

答案 16 :(得分:-1)

就像edg指出的那样,你需要一个更复杂的算法来处理特殊名称(这可能是为什么很多地方强迫一切都是大写的。)

像这样未经测试的c#应该处理你要求的简单案例:

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