簡體   English   中英

如何在C#中將大寫的名字和姓氏大寫?

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

有沒有一種簡單的方法可以大寫字符串的第一個字母並降低其余的字母? 是否有內置方法或需要自己制作?

TextInfo.ToTitleCase()將字符串的每個標記中的第一個字符大寫。
如果不需要維護首字母縮寫詞大寫,則應包括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

也可以使用正則表達式 \\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在過去's ,所以我們需要用后面的負樣子來處理它的正則表達式 (?<!'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

最直接的選擇是使用.NET中提供的ToTitleCase函數,該函數在大多數情況下應使用該名稱。 正如edg指出的那樣,有些名稱將不起作用,但是這些名稱很少見,因此除非您針對的是這樣的名稱很普遍的文化,否則不必擔心太多。

但是,如果您不使用.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”之類的格式,則需要根據逗號進行拆分。 但是,一旦將其拆分,就可以應用前面顯示的代碼。

我使用自己的方法來解決此問題:

例如,短語:“ 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;
}

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

返回〜我的名字

但是,像前面提到的McFly這樣的名稱仍然存在問題。

使用ToTitleCase的建議不適用於全部為大寫的字符串。 因此,您將必須在第一個字符上調用ToUpper,在其余字符上調用ToLower。

該類可以解決問題。 您可以向_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();
        }
}

如果您使用vS2k8,則可以使用擴展方法將其添加到String類:

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

我喜歡這樣:

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;

        }

為了解決一些突出顯示的問題/問題,我建議先將字符串轉換為小寫,然后再調用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);
}

就像edg所示,您將需要一種更復雜的算法來處理特殊名稱(這可能就是為什么許多地方將所有內容都強制使用大寫形式的原因)。

像這樣未經測試的C#之類的東西應該可以處理您請求的簡單情況:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM