Bagaimana cara saya membuat huruf pertama dari string huruf besar, tetapi tidak mengubah huruf apa pun dari huruf lainnya?
Sebagai contoh:
"this is a test"
->"This is a test"
"the Eiffel Tower"
->"The Eiffel Tower"
"/index.html"
->"/index.html"
javascript
string
letter
capitalize
Robert Wills
sumber
sumber
return str.replace(/(\b\w)/gi,function(m){return m.toUpperCase();});
string[0].toUpperCase() + string.substring(1)
`${s[0].toUpperCase()}${s.slice(1)}`
([initial, ...rest]) => [initial.toUpperCase(), ...rest].join("")
Jawaban:
Solusi dasarnya adalah:
Beberapa jawaban lain memodifikasi
String.prototype
(jawaban ini dulu juga), tetapi saya akan menyarankan ini sekarang karena rawatan (sulit untuk mengetahui di mana fungsi ditambahkan keprototype
dan dapat menyebabkan konflik jika kode lain menggunakan nama yang sama / browser menambahkan fungsi asli dengan nama yang sama di masa mendatang).... dan kemudian, ada jauh lebih banyak dari pertanyaan ini ketika Anda mempertimbangkan internasionalisasi, seperti yang ditunjukkan oleh jawaban yang bagus (terkubur di bawah).
Jika Anda ingin bekerja dengan titik kode Unicode alih-alih unit kode (misalnya untuk menangani karakter Unicode di luar Basic Multilingual Plane), Anda dapat memanfaatkan fakta yang
String#[@iterator]
bekerja dengan titik kode, dan Anda dapat menggunakantoLocaleUpperCase
untuk mendapatkan pelafalan yang benar secara lokal:Untuk opsi internasionalisasi yang lebih banyak lagi, silakan lihat jawaban asli di bawah ini .
sumber
the Eiffel Tower -> The Eiffel Tower
. Plus, fungsinya disebutcapitaliseFirstLetter
tidakcapitaliseFirstLetterAndLowerCaseAllTheOthers
.string[0].toUpperCase() + string.substring(1)
Berikut ini pendekatan yang lebih berorientasi objek:
Anda akan memanggil fungsinya, seperti ini:
Dengan output yang diharapkan:
sumber
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
Dalam CSS:
sumber
Ini adalah versi singkat dari jawaban populer yang mendapatkan huruf pertama dengan memperlakukan string sebagai array:
Memperbarui:
Menurut komentar di bawah ini tidak berfungsi di IE 7 atau di bawah.
Pembaruan 2:
Untuk menghindari
undefined
string kosong (lihat komentar @ njzk2 di bawah ), Anda dapat memeriksa string kosong:sumber
return s && s[0].toUpperCase() + s.slice(1);
Jika Anda tertarik dengan kinerja beberapa metode berbeda yang dipasang:
Berikut adalah metode tercepat berdasarkan uji jsperf ini (dipesan dari yang tercepat ke yang terlambat).
Seperti yang Anda lihat, dua metode pertama pada dasarnya sebanding dalam hal kinerja, sedangkan mengubah
String.prototype
sejauh ini paling lambat dalam hal kinerja.sumber
.slice(1)
dengan.substr(1)
akan meningkatkan kinerja lebih jauh.Untuk kasus lain saya membutuhkannya untuk huruf besar huruf pertama dan huruf kecil sisanya. Kasus-kasus berikut membuat saya mengubah fungsi ini:
sumber
Ini adalah 2018 ECMAScript 6+ Solution :
sumber
.slice()
lebih lambat dari.substring()
,str[0]
akanundefined
untuk string kosong dan menggunakan literal template untuk bergabung dengan dua bagian memperkenalkan di sini 8 karakter, sementara+
akan memperkenalkan hanya 3.${}
hanya menambahkan noise.const newStr = str[0].toUpperCase() + str.slice(1);
lebih mudah dibaca.Jika Anda sudah (atau mempertimbangkan) menggunakan
lodash
, solusinya mudah:Lihat dokumen mereka: https://lodash.com/docs#capitalize
_.camelCase('Foo Bar'); //=> 'fooBar'
https://lodash.com/docs/4.15.0#camelCase
Vanilla js untuk huruf besar pertama:
sumber
Huruf kapital pertama dari semua kata dalam string:
sumber
s => s.split(' ').map(x => x[0].toUpperCase() + x.slice(1)).join(' ')
Kita bisa mendapatkan karakter pertama dengan salah satu favorit saya
RegExp
, terlihat seperti smiley yang lucu:/^./
Dan untuk semua pecandu kopi:
... dan untuk semua orang yang berpikir bahwa ada cara yang lebih baik untuk melakukan ini, tanpa memperluas prototip asli:
sumber
'Answer'.replace(/^./, v => v.toLowerCase())
Menggunakan:
Ini akan ditampilkan
"Ruby java"
ke konsol.sumber
Jika Anda menggunakan underscore.js atau Lo-Dash , pustaka underscore.string menyediakan ekstensi string, termasuk huruf besar:
Contoh:
sumber
_.capitalize("foo") === "Foo"
.humanize
. Ini mengubah string yang digarisbawahi, camelized, atau dasherized menjadi yang manusiawi. Juga menghapus spasi awal dan akhir, dan menghapus postfix '_id'.Lalu:
Perbarui Nov.2016 (ES6), hanya untuk MENYENANGKAN:
kemudian
capitalize("hello") // Hello
sumber
const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();
.Solusi SHORTEST 3, 1 dan 2 menangani kasing saat
s
string""
,null
danundefined
:Tampilkan cuplikan kode
sumber
Hanya CSS
::first-letter
, itu berlaku untuk karakter pertama , yaitu dalam hal string%a
, pemilih ini akan berlaku untuk%
dan karenaa
itu tidak akan dikapitalisasi.:first-letter
).ES2015 satu-liner
Karena ada banyak jawaban, tetapi tidak ada dalam ES2015 yang akan menyelesaikan masalah asli secara efisien, saya datang dengan yang berikut:
Catatan
parameters => function
disebut fungsi panah .capitalizeFirstChar
alih-alihcapitalizeFirstLetter
, karena OP tidak meminta kode yang menggunakan huruf kapital pada huruf pertama di seluruh string, tetapi karakter pertama (jika huruf, tentu saja).const
memberi kami kemampuan untuk menyatakancapitalizeFirstChar
sebagai konstan, yang diinginkan karena sebagai seorang programmer Anda harus selalu secara eksplisit menyatakan niat Anda.string.charAt(0)
danstring[0]
. Namun perlu dicatat, bahwastring[0]
akanundefined
untuk string kosong, sehingga harus ditulis ulang untukstring && string[0]
, yang terlalu verbose, dibandingkan dengan alternatif.string.substring(1)
lebih cepat daristring.slice(1)
.Tolok ukur
sumber
Ada cara yang sangat sederhana untuk mengimplementasikannya dengan mengganti . Untuk ECMAScript 6:
Hasil:
sumber
/^[a-z]/i
akan lebih baik daripada menggunakan.
karena yang sebelumnya tidak akan mencoba untuk mengganti karakter selain hurufTampaknya lebih mudah di CSS:
Ini dari Properti text-transform CSS (di W3Schools ).
sumber
sumber
Saya tidak melihat ada disebutkan dalam jawaban yang ada masalah yang berkaitan dengan
poin kode pesawat astral atauinternasionalisasi. "Huruf Besar" tidak berarti hal yang sama di setiap bahasa menggunakan skrip yang diberikan.Awalnya saya tidak melihat jawaban yang membahas masalah yang terkait dengan poin kode pesawat astral. Ada satu , tapi agak terkubur (seperti ini, saya kira!)
Sebagian besar fungsi yang diusulkan terlihat seperti ini:
Namun, beberapa karakter yang berada di luar BMP (bidang multibahasa dasar, titik kode U + 0 hingga U + FFFF). Misalnya ambil teks Deseret ini:
Karakter pertama di sini gagal menjadi huruf besar karena properti string yang diindeks array tidak mengakses "karakter" atau titik kode *. Mereka mengakses unit kode UTF-16. Ini benar juga ketika mengiris - nilai indeks menunjuk pada unit kode.
Kebetulan bahwa unit kode UTF-16 adalah 1: 1 dengan titik kode USV dalam dua rentang, U + 0 hingga U + D7FF dan U + E000 ke U + FFFF inklusif. Sebagian besar karakter berhubung jatuh ke dalam dua rentang, tetapi tidak semuanya.
Dari ES2015 dan seterusnya, berurusan dengan ini menjadi sedikit lebih mudah.
String.prototype[@@iterator]
menghasilkan string yang sesuai dengan poin kode **. Jadi misalnya, kita bisa melakukan ini:Untuk string yang lebih lama, ini mungkin bukan *** yang sangat efisien - kita tidak benar-benar perlu untuk mengulanginya. Kita dapat menggunakan
String.prototype.codePointAt
untuk mendapatkan surat pertama (mungkin) itu, tetapi kita masih harus menentukan di mana potongan harus dimulai. Salah satu cara untuk menghindari iterasi sisanya adalah dengan menguji apakah codepoint pertama berada di luar BMP; jika tidak, irisan dimulai pada 1, dan jika ya, irisan dimulai pada 2.Anda bisa menggunakan matematika bitwise daripada di
> 0xFFFF
sana, tetapi mungkin lebih mudah untuk memahami cara ini dan juga akan mencapai hal yang sama.Kami juga dapat membuat ini bekerja di ES5 dan di bawah dengan mengambil logika itu sedikit lebih jauh jika perlu. Tidak ada metode intrinsik dalam ES5 untuk bekerja dengan codepoint, jadi kita harus menguji secara manual apakah unit kode pertama adalah pengganti ****:
Pada awalnya saya juga menyebutkan pertimbangan internasionalisasi. Beberapa di antaranya sangat sulit untuk diperhitungkan karena mereka membutuhkan pengetahuan tidak hanya tentang bahasa apa yang digunakan, tetapi juga mungkin memerlukan pengetahuan khusus tentang kata-kata dalam bahasa tersebut. Misalnya, digraf Irlandia "mb" menggunakan huruf kapital sebagai "mB" pada awal kata. Contoh lain, eszett Jerman, tidak pernah memulai kata (afaik), tetapi masih membantu menggambarkan masalahnya. Eszett huruf kecil ("ß") menggunakan huruf kapital untuk "SS," tetapi "SS" dapat menjadi huruf kecil menjadi "ß" atau "ss" - Anda memerlukan pengetahuan out-of-band dari bahasa Jerman untuk mengetahui mana yang benar!
Contoh paling terkenal dari masalah semacam ini, mungkin, adalah bahasa Turki. Dalam bahasa Latin Turki, bentuk huruf kapital dari i adalah İ, sedangkan bentuk huruf kecil dari I adalah ı - keduanya adalah huruf yang berbeda. Untungnya kami memiliki cara untuk menjelaskan hal ini:
Di browser, tag bahasa yang paling disukai pengguna ditunjukkan oleh
navigator.language
, daftar menurut preferensi ditemukan dinavigator.languages
, dan bahasa elemen DOM yang diberikan dapat diperoleh (biasanya) denganObject(element.closest('[lang]')).lang || YOUR_DEFAULT_HERE
dokumen multi bahasa.Di agen yang mendukung kelas karakter properti Unicode di RegExp, yang diperkenalkan di ES2018, kami dapat membersihkan hal-hal lebih lanjut dengan secara langsung mengekspresikan karakter apa yang kami minati:
Ini bisa sedikit di-tweak untuk menangani kapitalisasi beberapa kata dalam sebuah string dengan akurasi yang cukup baik. Properti
CWU
atau Changes_When_Uppercased karakter cocok dengan semua titik kode yang, baik, berubah ketika huruf besar. Kita dapat mencoba ini dengan karakter digraf titlecased seperti Belanda ij misalnya:Pada saat penulisan (Feb 2020), Firefox / Spidermonkey belum mengimplementasikan fitur RegExp yang diperkenalkan dalam dua tahun terakhir *****. Anda dapat memeriksa status terkini dari fitur ini di tabel compat Kangax . Babel dapat mengkompilasi literal RegExp dengan referensi properti ke pola yang setara tanpa mereka, tetapi perlu diketahui bahwa kode yang dihasilkan mungkin sangat besar.
Dalam semua kemungkinan, orang yang mengajukan pertanyaan ini tidak akan peduli dengan kapitalisasi Deseret atau internasionalisasi. Tapi ada baiknya menyadari masalah ini karena ada kemungkinan Anda akan menemukan mereka pada akhirnya, bahkan jika mereka tidak masalah saat ini. Mereka bukan kasus "tepi", atau lebih tepatnya, mereka bukan kasus tepi menurut definisi - ada seluruh negara di mana kebanyakan orang berbicara bahasa Turki, dan menggabungkan unit kode dengan codepoint adalah sumber bug yang cukup umum (terutama dengan berkaitan dengan emoji). Baik string dan bahasa cukup rumit!
* Unit kode UTF-16 / UCS2 juga merupakan titik kode Unicode dalam arti bahwa misalnya U + D800 secara teknis merupakan titik kode, tetapi bukan itu "artinya" di sini ... semacam ... meskipun ... kabur. Apa yang pasti bukan pengganti adalah USV (nilai skalar Unicode).
** Meskipun jika unit kode pengganti "yatim" - yaitu, bukan bagian dari pasangan logis - Anda masih bisa mendapatkan pengganti di sini juga.
*** mungkin. Saya belum mengujinya. Kecuali jika Anda telah menentukan kapitalisasi adalah hambatan yang berarti, saya mungkin tidak akan berkeringat - pilih apa pun yang Anda yakini paling jelas dan mudah dibaca.
**** fungsi seperti itu mungkin ingin menguji unit kode pertama dan kedua bukan hanya yang pertama, karena mungkin unit pertama adalah pengganti yatim piatu. Misalnya input "\ uD800x" akan menjadi huruf kapital X apa adanya, yang mungkin atau mungkin tidak diharapkan.
***** Inilah masalah Bugzilla jika Anda ingin mengikuti progres lebih langsung.
sumber
Selalu lebih baik untuk menangani hal-hal seperti ini menggunakan CSS terlebih dahulu , secara umum, jika Anda dapat menyelesaikan sesuatu menggunakan CSS, coba dulu itu, kemudian coba JavaScript untuk menyelesaikan masalah Anda, jadi dalam hal ini coba gunakan
:first-letter
dalam CSS dan terapkantext-transform:capitalize;
Jadi coba buat kelas untuk itu, jadi Anda bisa menggunakannya secara global, misalnya:
.first-letter-uppercase
dan tambahkan sesuatu seperti di bawah ini di CSS Anda:Juga opsi alternatifnya adalah JavaScript, jadi yang terbaik adalah seperti ini:
dan menyebutnya seperti:
Jika Anda ingin menggunakannya kembali berulang kali, lebih baik lampirkan ke javascript String asli, jadi sesuatu seperti di bawah ini:
dan menyebutnya sebagai berikut:
sumber
Jika Anda ingin memformat ulang teks lengkap, Anda mungkin ingin mengubah contoh lain seperti:
Ini akan memastikan bahwa teks berikut diubah:
sumber
sumber
substr
/substring
sedikit lebih semantik sebagai lawanslice
, tapi itu hanya masalah preferensi. Namun saya memasukkan contoh-contoh dengan string yang disediakan dalam pertanyaan, yang merupakan sentuhan yang bagus tidak ada dalam contoh '09. Jujur saya pikir itu bermuara pada 15 tahun saya menginginkan karma di StackOverflow;)Berikut adalah fungsi yang disebut ucfirst () (kependekan dari "huruf besar huruf pertama"):
Anda dapat menggunakan huruf kapital string dengan memanggil ucfirst ("some string") - misalnya,
Ia bekerja dengan memisahkan string menjadi dua bagian. Pada baris pertama ia mengeluarkan firstLetter dan kemudian pada baris kedua ia menggunakan huruf kapital firstLetter dengan memanggil firstLetter.toUpperCase () dan menggabungkannya dengan sisa string, yang ditemukan dengan memanggil str.substr (1) .
Anda mungkin berpikir ini akan gagal untuk string kosong, dan memang dalam bahasa seperti C Anda harus memenuhi ini. Namun dalam JavaScript, saat Anda mengambil substring dari string kosong, Anda hanya mendapatkan string kosong kembali.
sumber
substr()
usang? Bukan , bahkan sekarang, tiga tahun kemudian, apalagi di tahun 2009 ketika Anda membuat komentar ini.substr()
mungkin tidak ditandai sebagai ditinggalkan oleh implementasi ECMAScript populer (saya ragu itu tidak akan hilang dalam waktu dekat), tetapi itu bukan bagian dari spesifikasi ECMAScript. Edisi ke 3 dari spesifikasi menyebutkannya dalam lampiran non-normatif untuk "menyarankan semantik seragam untuk properti seperti itu tanpa menjadikan properti atau semantik mereka bagian dari standar ini".substring
,substr
danslice
) terlalu banyak, IMO. Saya selalu menggunakanslice
karena mendukung indeks negatif, tidak memiliki perilaku bertukar argumen yang membingungkan dan APInya mirip denganslice
bahasa lain.Pemakaian:
Ini adalah string teks => Ini adalah string teks
sumber
return.this.toLocaleLowerCase().replace(
...String.prototype.capitalize = function(){ return this.replace( /(^|\s)[a-z]/g , function(m){ return m.toUpperCase(); }); };
Saya sedikit memperbaiki kode Anda, Anda hanya perlu kecocokan pertama.sumber
Lihat solusi ini:
sumber
stringVal.replace(/^./, stringVal[0].toUpperCase());
stringVal[0]
akanundefined
kosongstringVal
, dan dengan demikian upaya untuk mengakses properti.toUpperCase()
akan membuat kesalahan.(Anda dapat merangkumnya dalam suatu fungsi atau bahkan menambahkannya ke prototipe String jika Anda sering menggunakannya.)
sumber
The
ucfirst
fungsi bekerja jika Anda melakukannya seperti ini.Terima kasih JP untuk aksinya.
sumber
string[0].toUpperCase() + string.substring(1)
(string[0] || '').toUpperCase() + string.substring(1)
(string[0] || '')
Anda bisa sajastring.charAt(0)
.Anda bisa melakukannya dalam satu baris seperti ini
sumber
Saya menemukan fungsi panah ini paling mudah. Ganti cocok dengan karakter huruf pertama (
\w
) dari string Anda dan mengubahnya menjadi huruf besar. Tidak ada yang lebih menarik.sumber
/./
karena dua alasan:/\w/
akan melewatkan semua karakter yang bukan huruf sebelumnya (jadi @@ abc akan menjadi @@ Abc), dan kemudian tidak berfungsi dengan karakter bukan-latin