it-swarm-vi.tech

Làm cách nào để viết hoa chữ cái đầu của tên và họ trong C #?

Có một cách dễ dàng để viết hoa chữ cái đầu tiên của chuỗi và hạ thấp phần còn lại của chuỗi không? Có một phương pháp được xây dựng trong hoặc tôi cần phải làm cho riêng mình?

139
Mike Roosa

TextInfo.ToTitleCase() viết hoa ký tự đầu tiên trong mỗi mã thông báo của chuỗi.
[.__.] Nếu không cần phải duy trì Viết tắt từ viết tắt, thì bạn nên bao gồm ToLower().

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

Nếu CurrentCARM không khả dụng, hãy sử dụng:

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

Xem Liên kết MSDN để biết mô tả chi tiết.

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

Các mã trên sẽ không hoạt động .....

vì vậy, đặt mã dưới đây bằng cách chuyển đổi để thấp hơn sau đó áp dụng chức năng

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

Có một số trường hợp CultureInfo.CurrentCulture.TextInfo.ToTitleCase không thể xử lý, ví dụ: dấu nháy đơn '.

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

Một regex cũng có thể được sử dụng \b[a-zA-Z] để xác định ký tự bắt đầu của một Word sau một ranh giới Word \b, sau đó chúng ta cần chỉ để thay thế trận đấu bằng tương đương chữ hoa của nó nhờ vào phương thức 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

Chẳng hạn, regex có thể được điều chỉnh nếu cần, chẳng hạn, nếu chúng ta muốn xử lý MacDonaldMcFry trường hợp regex trở thành : (?<=\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

Nếu chúng ta cần xử lý nhiều tiền tố hơn, chúng ta chỉ cần sửa đổi nhóm (?:mc|mac), ví dụ để thêm tiền tố tiếng Pháp du, de: (?:mc|mac|du|de).

Cuối cùng, chúng ta có thể nhận ra rằng regex regex này cũng sẽ khớp với trường hợp MacDonald'S cho lần cuối 's vì vậy chúng ta cần xử lý nó trong regex với cái nhìn tiêu cực đằng sau (?<!'s\b). Cuối cùng, chúng ta có:

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
14
polkduran

Mc và Mac là tiền tố họ phổ biến trên khắp Hoa Kỳ và có những loại khác. TextInfo.ToTitleCase không xử lý các trường hợp đó và không nên được sử dụng cho mục đích này. Đây là cách tôi đang làm:

    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;
    }
7
Jamie Ide

ToTitleCase () sẽ hoạt động cho bạn.

http://support.Microsoft.com/kb/31289

5
ckal

Tùy chọn trực tiếp nhất sẽ là sử dụng hàm ToTitleCase có sẵn trong .NET, phần lớn sẽ quan tâm đến tên hầu hết thời gian. Như edg chỉ ra rằng có một số tên mà nó sẽ không hoạt động, nhưng chúng khá hiếm vì vậy trừ khi bạn nhắm mục tiêu vào một nền văn hóa nơi những cái tên đó là phổ biến, bạn cũng không cần phải lo lắng nhiều về.

Tuy nhiên, nếu bạn không làm việc với ngôn ngữ .NET, thì nó phụ thuộc vào đầu vào trông như thế nào - nếu bạn có hai trường riêng biệt cho tên đầu tiên và tên cuối cùng thì bạn có thể viết hoa chữ cái đầu tiên thấp hơn phần còn lại của nó bằng cách sử dụng chất nền.

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

Tuy nhiên, nếu bạn được cung cấp nhiều tên như một phần của cùng một chuỗi thì bạn cần biết bạn đang lấy thông tin như thế nào và tách nó tương ứng. Vì vậy, nếu bạn nhận được một cái tên như "John Doe", bạn hãy tách chuỗi dựa trên ký tự khoảng trắng. Nếu nó ở định dạng như "Doe, John", bạn sẽ cần phải phân tách nó dựa trên dấu phẩy. Tuy nhiên, một khi bạn đã tách nó ra, bạn chỉ cần áp dụng mã được hiển thị trước đó.

4
rjzii

Tôi sử dụng phương pháp của riêng tôi để sửa lỗi này:

Ví dụ: cụm từ: "xin chào thế giới. Xin chào, đây là thế giới stackoverflow." sẽ là "Xin chào thế giới. Xin chào đây là thế giới Stackoverflow." Regex\b (bắt đầu một từ)\w (charactor đầu tiên của Word) sẽ thực hiện thủ thuật.

/// <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;
}
3
Ton Snoei

CultureInfo.CiverseCARM.TextInfo.ToTitleCase ("tên tôi");

trả về ~ Tên tôi

Nhưng vấn đề vẫn tồn tại với những cái tên như McFly như đã nêu trước đó.

3
David C

Lớp học này thực hiện các mẹo. Bạn có thể thêm tiền tố mới vào _ tiền tố mảng chuỗi tĩnh.

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

Các đề xuất sử dụng ToTitleCase sẽ không hoạt động đối với các chuỗi có chữ hoa. Vì vậy, bạn sẽ phải gọi ToUpper trên char đầu tiên và ToLower trên các ký tự còn lại.

2
Tundey

Nếu bạn sử dụng vS2k8, bạn có thể sử dụng một phương thức mở rộng để thêm nó vào lớp String:

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

Để giải quyết một số vấn đề/vấn đề đã được làm nổi bật, tôi sẽ đề nghị chuyển đổi chuỗi thành chữ thường trước và sau đó gọi phương thức ToTitleCase. Sau đó, bạn có thể sử dụng IndexOf ("Mc") hoặc IndexOf ("O\'") để xác định các trường hợp đặc biệt cần chú ý cụ thể hơn.

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);
}
0
Andy Rose
 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;

        }
0
Govind Singh Rawat

Tôi thích cách này:

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

Được nâng lên từ đây bài viết MSDN .

0
TrentVB

Hy vọng điều này sẽ giúp bạn.

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