it-swarm-id.com

Bagaimana cara mengubah huruf besar dari nama depan dan nama belakang dalam C #?

Apakah ada cara mudah untuk menggunakan huruf besar dari string dan menurunkannya? Apakah ada metode bawaan atau apakah saya perlu membuatnya sendiri?

139
Mike Roosa

TextInfo.ToTitleCase() memberi huruf kapital karakter pertama dalam setiap token string.
Jika tidak perlu mempertahankan Acronym Uppercasing, maka Anda harus menyertakan ToLower().

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

Jika CurrentCulture tidak tersedia, gunakan:

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

Lihat Link MSDN untuk deskripsi terperinci.

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

Kode di atas tidak akan berfungsi .....

jadi letakkan kode di bawah ini dengan mengonversi ke bawah lalu menerapkan fungsi

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

Ada beberapa kasus yang CultureInfo.CurrentCulture.TextInfo.ToTitleCase tidak dapat menangani, misalnya: tanda kutip '.

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

A regex juga dapat digunakan \b[a-zA-Z] untuk mengidentifikasi karakter awal dari suatu Kata setelah batas kata \b, maka kita perlu hanya untuk mengganti kecocokan dengan ekivalensi huruf besar berkat metode 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

Regex dapat disetel jika diperlukan, misalnya, jika kita ingin menangani kasus MacDonald dan McFry regex menjadi: (?<=\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

Jika kita perlu menangani lebih banyak awalan, kita hanya perlu memodifikasi grup (?:mc|mac), misalnya untuk menambahkan awalan perancis du, de: (?:mc|mac|du|de).

Akhirnya, kita dapat menyadari bahwa regex ini juga akan cocok dengan case MacDonald'S untuk yang terakhir 's jadi kita perlu menanganinya di regex dengan tampilan negatif di belakang (?<!'s\b). Pada akhirnya kami memiliki:

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 dan Mac adalah awalan nama keluarga umum di seluruh AS, dan ada yang lainnya. TextInfo.ToTitleCase tidak menangani kasus tersebut dan tidak boleh digunakan untuk tujuan ini. Begini cara saya melakukannya:

    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 () harus bekerja untuk Anda.

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

5
ckal

Opsi paling langsung adalah menggunakan fungsi ToTitleCase yang tersedia di .NET yang seharusnya menangani sebagian besar nama. Seperti edg menunjukkan ada beberapa nama yang tidak akan berhasil, tetapi ini cukup langka jadi kecuali Anda menargetkan budaya di mana nama-nama seperti itu umum maka tidak perlu sesuatu yang harus Anda khawatirkan juga banyak tentang.

Namun jika Anda tidak bekerja dengan langauge .NET, maka itu tergantung pada apa yang tampak seperti input - jika Anda memiliki dua bidang terpisah untuk nama depan dan nama belakang maka Anda bisa menggunakan huruf besar huruf pertama dan sisanya dengan menggunakan substring.

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

Namun, jika Anda diberikan beberapa nama sebagai bagian dari string yang sama maka Anda perlu tahu bagaimana Anda mendapatkan informasi dan membaginya sesuai. Jadi jika Anda mendapatkan nama seperti "John Doe" Anda membagi string berdasarkan karakter ruang. Jika dalam format seperti "Doe, John" Anda harus membaginya berdasarkan koma. Namun, setelah Anda membaginya, Anda hanya menerapkan kode yang ditunjukkan sebelumnya.

4
rjzii

Saya menggunakan metode saya sendiri untuk memperbaikinya:

Misalnya ungkapan: "Halo dunia. Halo ini adalah dunia stackoverflow." akan menjadi "Hello World. Hello This Is The Stackoverflow World.". Regex\b (mulai dari Word)\w (karakter pertama dari Word) akan melakukan trik.

/// <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.CurrentCulture.TextInfo.ToTitleCase ("nama saya");

kembali ~ Nama Saya

Tapi masalahnya masih ada dengan nama-nama seperti McFly seperti yang dinyatakan sebelumnya.

3
David C

Kelas ini berhasil. Anda dapat menambahkan awalan baru ke _ awalan array string statis.

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

Saran untuk menggunakan ToTitleCase tidak akan berfungsi untuk string yang semuanya huruf besar. Jadi, Anda harus memanggil ToUpper pada char pertama dan ToLower pada karakter yang tersisa.

2
Tundey

Jika Anda menggunakan vS2k8, Anda bisa menggunakan metode ekstensi untuk menambahkannya ke kelas String:

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

Untuk menyelesaikan beberapa masalah/masalah yang telah saya soroti, saya sarankan untuk mengubah string menjadi huruf kecil terlebih dahulu dan kemudian memanggil metode ToTitleCase. Anda kemudian dapat menggunakan IndexOf ("Mc") atau IndexOf ("O\'") untuk menentukan kasus khusus yang memerlukan perhatian lebih khusus.

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

Saya suka cara ini:

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

Diangkat dari ini artikel MSDN .

0
TrentVB

Semoga ini bisa membantu Anda.

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