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

在C#中,如何将名字和姓氏的首字母大写?,c#,string,capitalize,C#,String,Capitalize,有没有一种简单的方法可以将字符串的第一个字母大写并降低其剩余部分?是否有内置方法或我需要自己创建方法?TextInfo.ToTitleCase()将字符串中每个标记的第一个字符大写。 如果不需要维护首字母缩略词大写,则应包括ToLower() 如果CurrentCulture不可用,请使用: string s = "JOHN DOE"; s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.

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

TextInfo.ToTitleCase()
将字符串中每个标记的第一个字符大写。
如果不需要维护首字母缩略词大写,则应包括
ToLower()

如果CurrentCulture不可用,请使用:

string s = "JOHN DOE";
s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower());
有关详细说明,请参阅。

ToTitleCase()应该适合您


最直接的选择是使用.NET中提供的函数,该函数在大多数情况下都会处理名称。正如所指出的,有些名字是不适用的,但这些名字是相当罕见的,因此,除非你针对的是一种文化,在这种文化中,这样的名字很常见,否则你不必太担心

但是,如果您没有使用.NET语言,那么这取决于输入的外观-如果您的名字和姓氏有两个单独的字段,那么您可以使用子字符串将第一个字母大写,然后将其剩余部分放低

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

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

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

返回~我的名字


但如前所述,McFly等名称仍然存在问题。

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

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

正如edg所指出的,您将需要一个更复杂的算法来处理特殊名称(这可能就是为什么许多地方强制所有内容都使用大写)

像这样未经测试的c#应该可以处理您请求的简单案例:

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

使用ToTitleCase的建议对于全是大写的字符串不起作用。因此,您必须在第一个字符上调用ToUpper,在其余字符上调用ToLower。

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;
    }
publicstaticstringtotitlecase(stringstr)
{
字符串结果=str;
如果(!string.IsNullOrEmpty(str))
{
变量词=str.Split(“”);
for(int index=0;index0)
{
words[index]=s[0].ToString().ToUpper()+s.Substring(1);
}
}
结果=string.Join(“,单词);
}
返回结果;
}

这门课就做到了。您可以将新前缀添加到\u前缀静态字符串数组中

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

为了解决ben强调的一些问题,我建议先将字符串转换为小写,然后调用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);
}
上面的代码不起作用

因此,将下面的代码转换为lower,然后应用函数

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

我使用自己的方法修复此问题:

例如,短语“你好,世界。你好,这是stackoverflow世界。”将是“你好,世界。你好,这是stackoverflow世界”。Regex\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;
}
//
///使每个单词的第一个字母都大写。其余的将是小写的
/// 
/// 
/// 
公共静态字符串格式WordswithFirstCapital(字符串短语)
{
MatchCollection Matches=Regex.Matches(短语“\\b\\w”);
短语=短语.ToLower();
foreach(匹配中的匹配)
短语=短语.Remove(Match.Index,1).Insert(Match.Index,Match.Value.ToUpper());
返回短语;
}
我喜欢这样:

using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());
从中解脱出来。

希望这对你有所帮助

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

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

string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo
Aregex也可用于
\b[A-zA-Z]
识别单词边界后单词的起始字符
\b
,然后我们只需将匹配项替换为大写等效项即可,方法如下:

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

regex可以根据需要进行调整,例如,如果我们想处理
MacDonald
McFry
的情况,regex就会变成:
(?Aww snap!很好的回答。我总是忘记全球化的东西。很好的解决方案!在VB.Net中:
sItem=globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(地点:托洛尔)'第一个字符大写
您需要检测每个单独名称的区域性,而不是当前区域性。这对名称不起作用。因为这依赖于
当前区域性
,我们如何确保没有区域性以不同的方式处理此问题?忘记这一点--使用全球化类这里需要注意的一点是它不起作用“如果字符串都是大写,则不起作用。它认为所有大写字母都是首字母缩略词。我看到的很多情况是,你不能依赖它们。如果名称像麦凯恩,或者如果你开始使用更多的外国名称,则不起作用。@roosa-简单解决这个问题(val.ToLower())+1我知道它必须已经在FCL中,google把我带到这里=DUnlike Nathan在下面的回答中,我得到了一个错误:“非静态字段、方法或属性需要对象引用……”不幸的是。为什么不调用
String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);
string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo
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
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
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
 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;

        }