Apakah ada cara mudah untuk menggunakan huruf besar dari string pertama dan menurunkan sisanya? Apakah ada metode bawaan atau apakah saya perlu membuatnya sendiri?
c#
string
capitalize
Mike Roosa
sumber
sumber
Jawaban:
TextInfo.ToTitleCase()
mengkapitalkan karakter pertama dalam setiap token string.Jika tidak perlu mempertahankan Acronym Uppercasing, maka Anda harus memasukkan
ToLower()
.Jika CurrentCulture tidak tersedia, gunakan:
Lihat Tautan MSDN untuk deskripsi terperinci.
sumber
sumber
sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
CurrentCulture
, bagaimana kita bisa yakin bahwa tidak ada budaya yang menangani hal ini secara berbeda?Kode di atas tidak akan berfungsi .....
jadi letakkan kode di bawah ini dengan mengkonversi ke bawah lalu menerapkan fungsi
sumber
Ada beberapa kasus yang
CultureInfo.CurrentCulture.TextInfo.ToTitleCase
tidak bisa ditangani, misalnya: apostrof'
.Sebuah regex juga dapat digunakan
\b[a-zA-Z]
untuk mengidentifikasi karakter mulai dari sebuah kata setelah batas kata\b
, maka kita perlu hanya untuk mengganti pertandingan dengan kasus kesetaraan nya berkat atas keRegex.Replace(string input,string pattern,MatchEvaluator evaluator)
metode:The regex dapat disetel jika diperlukan, misalnya, jika kita ingin menangani
MacDonald
danMcFry
kasus regex menjadi:(?<=\b(?:mc|mac)?)[a-zA-Z]
Jika kita perlu menangani lebih prefiks kita hanya perlu memodifikasi kelompok
(?:mc|mac)
, misalnya untuk menambahkan prefiks Prancisdu, de
:(?:mc|mac|du|de)
.Akhirnya, kita dapat menyadari bahwa regex ini juga akan cocok dengan case
MacDonald'S
untuk yang terakhir's
sehingga kita harus menanganinya di regex dengan tampilan negatif di belakang(?<!'s\b)
. Pada akhirnya kami memiliki:sumber
\b[ivxlcdm]+$|
begitulah\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)
. Ini akan membuat upercase semua kata penutup dari nama yang memiliki format angka romawi yang tidak ketat (ivxlcdm
). Namun Anda mungkin memiliki beberapa hasil yang tidak diinginkan, misalnya 'Li' akan menjadi 'LI'Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
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:
sumber
ToTitleCase () harus bekerja untuk Anda.
http://support.microsoft.com/kb/312890
sumber
Opsi yang paling langsung adalah menggunakan fungsi ToTitleCase yang tersedia di .NET yang seharusnya menangani sebagian besar nama. Seperti yang ditunjukkan edg ada beberapa nama yang tidak akan berhasil, tetapi ini cukup langka jadi kecuali Anda menargetkan budaya di mana nama-nama seperti itu umum, tidak perlu sesuatu yang harus Anda khawatirkan terlalu banyak.
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.
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.
sumber
CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("nama saya");
kembali ~ Nama Saya
Tapi masalahnya masih ada dengan nama-nama seperti McFly seperti yang dinyatakan sebelumnya.
sumber
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 (awal kata) \ w (karakter pertama kata) akan melakukan trik.
sumber
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.
sumber
Kelas ini berhasil. Anda dapat menambahkan awalan baru ke array string statis _prefixes .
sumber
Jika Anda menggunakan vS2k8, Anda bisa menggunakan metode ekstensi untuk menambahkannya ke kelas String:
sumber
Char.ToUpper(input[0]) + input.Substring(1)
IMHO lebih mudah dibaca.input.FirstLetterToUpper()
tentu saja lebih mudah dibaca vsChar.ToUpper(input[0]) + input.Substring(1)
, tetapi kurang transparanUntuk 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.
sumber
Saya suka seperti ini:
Diangkat dari artikel MSDN ini .
sumber
Semoga ini bisa membantu Anda.
sumber
sumber
Seperti yang ditunjukkan edg, Anda akan memerlukan algoritma yang lebih kompleks untuk menangani nama-nama khusus (ini mungkin mengapa banyak tempat memaksakan segalanya untuk huruf besar).
Sesuatu seperti c # yang belum diuji ini harus menangani kasus sederhana yang Anda minta:
sumber