关于字符串:如何在C中大写名字和姓氏的首字母?

关于字符串:如何在C中大写名字和姓氏的首字母?

How do I capitalize first letter of first name and last name in C#?

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


第一TextInfo.ToTitleCase()capitalizes令牌字符串中每一字符。
如果有需要,以维持在uppercasing的缩写,你应该有ToLower()

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

如果CurrentCulture不可用时,使用:

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

参见MSDN链接的详细描述。


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


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

上述代码wont工作……

把下面的代码的操作系统,然后通过转换到较低的应用功能

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

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

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

regex还可以用\b[a-zA-Z]来标识单词边界\b后的起始字符,然后我们只需要用其大写等价替换匹配,这要归功于Regex.Replace(string input,string pattern,MatchEvaluator evaluator)方法:

1
2
3
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的情况,可以根据需要调整regex,regex变成:(?<=\b(?:mc|mac)?)[a-zA-Z]

1
2
3
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)

最后,我们可以认识到,这个regex也将与最后一个'sMacDonald'S匹配,所以我们需要在regex中处理它,在(?后面有一个否定的外观。最后我们有:

1
2
3
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是prefixes普通姓氏在美国,和有其他人。是不是把那些textinfo.totitlecase案件和不被用于这一目的的T。这是怎么我做它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    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()的工作。

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


最直接的选择是要使用的功能是totitlecase是可用的网络名称,应该照顾大部分时间。有一些尖的边缘,它的名字是不会工作的,但这些都是罕见的,除非你是fairly操作系统名称,如靶向的文化是必要的,它不是一个普通的东西,你有什么担心的太多了。

然而,如果你的工作是不是与.NET语言,那么它取决于什么样的投入上看,如果你有两个单独的域的第一名称和最后的名称,然后你可以只利用了第一个下的其余substrings它使用。

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

然而,如果你设置多个名称相同的字符串的一部分,然后你要知道你得到的信息,与它相应的分裂。所以,如果你要在你的名字一样,"约翰"的基础上,在空间的分割字符串的字符。如果它是在格式如"约翰多伊,你将需要"基于逗号分割它。然而,一旦你有它,你只是利用分裂中所示的代码。


我用我自己的方法来得到这个固定。

例如:"Hello World"的说法。这是世界的"计算器"将"Hello World。。。。。。。。。。。。。。这是"计算器"的世界。。。。。。。。。。。。。。正则表达式(开始 b W(字)的第一特征字)将的戏法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// <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;
}

cultureinfo.currentculture.textinfo.totitlecase("我的名字");

返回我的名字

但问题仍然存在与类的名称表示,早期的小飞侠。


这类做把戏。你可以添加新的_ prefixes prefixes字符串数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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();
        }
}

建议使用的totitlecase不会串,都是工作上的情况。所以,你要会写的第一个字符的在线和电话同时在线剩下的字符。


如果你使用vs2k8,你可以使用一个扩展的DDA方法:它的字符串类

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 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;

        }

得圆一些的问题/问题,我会有一个本highlighted suggest转换字符串,然后调用到下一totitlecase案例的方法。然后你可以使用返回返回("MC")或("")来确定需要更多的关注这一特殊案例的特异性。

1
2
3
4
5
6
7
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);
}

我喜欢这种方式。

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

升从这MSDN文章。


希望这帮助你。

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


电火花显示类,你需要更复杂的算法来处理特殊的名字(这可能是为什么很多地方都对上力的案例)。

像这样的东西untested C #应该简单的案例:把你的请求

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

推荐阅读