Bir dize harfinin ilk harfini JavaScript'te nasıl yapabilirim?


3760

Bir dize büyük harfinin ilk harfini nasıl yapabilirim, ancak diğer harflerin büyüklüğünü nasıl değiştirmem?

Örneğin:

  • "this is a test" -> "This is a test"
  • "the Eiffel Tower" -> "The Eiffel Tower"
  • "/index.html" -> "/index.html"

12
Alt çizgi , bu ve diğer birçok harika aracı içeren underscore.string adlı bir eklentiye sahiptir .
Aaron

ne hakkında:return str.replace(/(\b\w)/gi,function(m){return m.toUpperCase();});
Muhammed Umer

111
Daha basit:string[0].toUpperCase() + string.substring(1)
dr.dimitru

7
`${s[0].toUpperCase()}${s.slice(1)}`
noego

([initial, ...rest]) => [initial.toUpperCase(), ...rest].join("")
Константин Ван

Yanıtlar:


5808

Temel çözüm:

function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

console.log(capitalizeFirstLetter('foo')); // Foo

Diğer bazı cevaplar değişir String.prototype(bu cevap da kullanılmış), ancak şimdi sürdürülebilirlik (işlevin nereye eklendiğini bulmak zor prototypeve diğer kod aynı adı / tarayıcıyı kullanıyorsa çakışmalara neden olabilir) gelecekte aynı ada sahip bir yerel işlev ekler).

... ve sonra, uluslararasılaşmayı düşündüğünüzde, bu şaşırtıcı derecede iyi cevabın (aşağıda gömülü) gösterdiği gibi, bu soruda çok daha fazlası var .

Kod birimleri yerine Unicode kod noktalarıyla çalışmak istiyorsanız (örneğin, Temel Çok Dilli Düzlem'in dışındaki Unicode karakterleri işlemek için) String#[@iterator]kod noktalarıyla çalışan gerçeği kaldırabilir ve toLocaleUpperCaseyerel ayarlara uygun üst yayın almak için kullanabilirsiniz :

function capitalizeFirstLetter([ first, ...rest ], locale = navigator.language) {
  return [ first.toLocaleUpperCase(locale), ...rest ].join('');
}

console.log(capitalizeFirstLetter('foo')); // Foo
console.log(capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉")); // "𐐎𐐲𐑌𐐼𐐲𐑉" (correct!)
console.log(capitalizeFirstLetter("italya", 'tr')); // İtalya" (correct in Turkish Latin!)

Daha fazla uluslararasılaştırma seçeneği için lütfen aşağıdaki orijinal yanıta bakın .


9
substring
substr'den

6
karim79'a eklemek için - javascript gibi bir işlevi yapmak için aşırı bir olasılık, işlev kaydırma olmadan değişkene aynı şeyi yapar. Bir işlevi kullanarak daha açık olacağını düşünüyorum, ama onun doğal aksi, neden bir işlev sarıcı ile karmaşık?
Ross

18
Dilim (1) 'i de alttan almamalı mıyız?
hasen

177
Hayır, çünkü OP bu örneği verdi: the Eiffel Tower -> The Eiffel Tower. Ayrıca, işlev capitaliseFirstLetterdeğil denir capitaliseFirstLetterAndLowerCaseAllTheOthers.
ban-geoengineering

22
Kimse önemli OOP kuralını umursamıyor mu? - Sahip olmadığınız nesneleri asla düzenlemeyin mi? . BTW, bu tek astar çok daha zarif görünüyor:string[0].toUpperCase() + string.substring(1)
dr.dimitru

1350

İşte daha nesne yönelimli bir yaklaşım:

String.prototype.capitalize = function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
}

İşlevi şöyle çağırırsınız:

"hello world".capitalize();

Beklenen çıktı ile:

"Hello world" 

24
Bu çözümü seviyorum çünkü Ruby gibi ve Ruby tatlı! :) Ben tam olarak Ruby gibi çalışır böylece dizenin diğer tüm harfleri küçük harf:return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
ma11hew28

164
Prototype.js sonrası dünyada, yerel nesnelerin değiştirilmesi veya genişletilmesi önerilmez.
Ryan

191
@rxgx - "Uzatma" öcü adam şimdi ölmeye başlıyor (şükürler olsun) ve insanlar kafalarını jSand'dan çekiyor ve bunun sadece bir dil özelliği olduğunu fark ediyorlar. Prototype.js, Object'in kendisini kısa bir süre için genişletmesi, Yerlileri genişletmenin kötü olduğu anlamına gelmez. Bilinmeyen bir tüketiciye (rastgele sitelere giden bir analiz komut dosyası gibi) kod yazıyorsanız, ancak bunun dışında iyi yapmamalısınız.
csuwldcat

43
@csuwldcat Kullandığınız başka bir kütüphane bilmeden kendi baş harflerini eklerse ne olur? Prototype.js tarafından yapılmış olsun ya da olmasın, prototipleri genişletmek kötü bir formdur. ES6 ile, intrinsics pastanızı almanıza ve onu da yemenize izin verecektir. ECMASCRIPT şartnamesine uygun şimler yaratan insanlar için "öcü adam" ın kafasını karıştırabileceğinizi düşünüyorum. Bu şimler mükemmeldir, çünkü şim ekleyen başka bir kütüphane onu aynı şekilde uygular. Bununla birlikte, kendi spesifik olmayan intrinsiklerinizi eklemekten kaçınılmalıdır.
Justin Meyer

43
Yerlileri genişletmek son derece kötü bir uygulamadır. "Ah asla bu kodu asla başka bir şeyle kullanmayacağım" dersen bile, sen (ya da başkası) muhtemelen kullanacaksın Daha sonra biri garip matematik hatalarını anlamaya çalışmak için üç gün geçirecekler, çünkü birisi Number.money () 'i diğer kütüphanenizden biraz farklı para birimi ile başa çıkmak için genişletti. Cidden, bunun büyük bir şirkette olduğunu gördüm ve yerlilerin prototiplerine karışan bir kütüphane geliştirmeyi bulmak için kimsenin hata ayıklamasına değmez.
phreakhead

573

CSS'de:

p:first-letter {
    text-transform:capitalize;
}

80
OP bir JS çözümü istiyor.
Antonio Max

129
. $ ( '# mystring_id') Metin (string) .css ( 'yararlanmak', 'text-transform');
DonMB

21
Ayrıca, bu yalnızca dizenin görüntülenmesini etkiler - gerçek değeri değil. Bir biçimdeyse, örneğin, değer olduğu gibi gönderilir.
dmansfield

12
Bu cevap, bir CSS çözümünün gerçekten yaptığım şey için daha uygun olduğunu anlamama yardımcı oldu. @dudewad: Yanıt muhtemelen bunun bir JS çözümü olmadığını, ancak ihtiyaca bağlı olarak daha uygun olabileceğine dair bir feragatname vermelidir.
Joshden

58
Bu soruya gelen izleyicilerin yaklaşık% 80'i için bu en iyi cevap olacaktır. Değil bir cevap sorusuna , bunlarla soruna yerine.
Jivan

290

Dizeyi bir dizi olarak ele alarak ilk harfi alan popüler yanıtın kısaltılmış bir sürümü:

function capitalize(s)
{
    return s[0].toUpperCase() + s.slice(1);
}

Güncelleme:

Aşağıdaki yorumlara göre bu IE 7 veya daha düşük sürümlerde çalışmaz.

Güncelleme 2:

undefinedBoş dizelerden kaçınmak için (aşağıdaki @ njzk2'nin açıklamasına bakın ), boş bir dize olup olmadığını kontrol edebilirsiniz:

function capitalize(s)
{
    return s && s[0].toUpperCase() + s.slice(1);
}

23
Bu tarayıcılar IE <8'de çalışmaz, çünkü bu tarayıcılar dize endekslemeyi desteklemez. IE8 kendisini destekliyor, ancak yalnızca dize değişmezleri için - dize nesneleri için değil.
Mathias Bynens

52
kimin umurunda, IE7 pazarı% 5'ten az! ve bunlar muhtemelen sizin gremma ve grempa'nızın eski makinesidir. Kısa kod FTW diyorum!
vsync

@MathiasBynens Bunun eski IE olmayan tarayıcıları mı yoksa sadece IE7'yi mi etkilediğini biliyor musunuz? 2014'te dizgi değişmezlerini dizine eklemekten başka hiçbir tarayıcı etkilenmezse iyi olmalıyız. :)
hexalys

3
@vsync Sadece kullanıcı demografik verilerinize bağlı olarak, bazen (2014 ve ötesini geçtikçe minnetle daha az ve daha az olsa da) IE7 gibi eski tarayıcıları desteklemenin karlı olduğunu
kastediyorum

2
@ njzk2 boş bir dize işlemek için, bunu güncelleyebilirsiniz: return s && s[0].toUpperCase() + s.slice(1);
joelvh

188

Gönderilen birkaç farklı yöntemin performansıyla ilgileniyorsanız:

İşte bu jsperf testine dayanan en hızlı yöntemler (en hızlıdan en yavaşına sıralanmıştır).

Gördüğünüz gibi, ilk iki yöntem performans açısından temelde karşılaştırılabilirken, bunu değiştirmek performans açısından String.prototypeçok yavaştır.

// 10,889,187 operations/sec
function capitalizeFirstLetter(string) {
    return string[0].toUpperCase() + string.slice(1);
}

// 10,875,535 operations/sec
function capitalizeFirstLetter(string) {
    return string.charAt(0).toUpperCase() + string.slice(1);
}

// 4,632,536 operations/sec
function capitalizeFirstLetter(string) {
    return string.replace(/^./, string[0].toUpperCase());
}

// 1,977,828 operations/sec
String.prototype.capitalizeFirstLetter = function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
}

resim açıklamasını buraya girin


1
Başlatma kodu da fark yaratmıyor gibi görünüyor: jsperf.com/capitalize-first-letter-of-string/2
user420667 22:16

6
Yerine bunu da Not .slice(1)ile .substr(1)daha da performansını artıracak.
Przemek

2
Makul bir düşünce. Bununla birlikte, çoğu durumda performans hitinin bile fark edilmediğini unutmayın: "En yavaş" yaklaşım bile 10 ms'de 19k dizeleri işleyecektir. Bu yüzden sizin için en rahat olanı kullanın.
Eddie

1
Herkesin (benim gibi) bunun son dört yılda performansının nasıl arttığını merak etmesi durumunda, 2018 macbook pro'daki üçüncü işlevin ops / sn değeri 135.307.869'dadır, bu nedenle aslında 12.4 kat daha hızlıdır.
Carlo Field

151

Başka bir durumda, ilk harfi büyük harfle yazıp geri kalanını küçük harfle yazmam gerekiyor. Aşağıdaki durumlar bu işlevi değiştirmemi sağladı:

//es5
function capitalize(string) {
    return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
}
capitalize("alfredo")  // => "Alfredo"
capitalize("Alejandro")// => "Alejandro
capitalize("ALBERTO")  // => "Alberto"
capitalize("ArMaNdO")  // => "Armando"

// es6 using destructuring 
const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();

1
"... ama diğer harflerin herhangi birinin durumunu değiştirmez". Bu OP'nin sorduğu soruya doğru bir cevap değil.
Carlos Muñoz

2
@ CarlosMuñoz açılış cümlesini okursanız bunun farklı bir dava için olduğunu söylüyor.
TMH

3
@TomHart Tam olarak bu yüzden soru için bir çözüm değil. Bir yorum ya da başka bir soru ve cevap olmalı
Carlos Muñoz

15
Bu konuda sana katılıyorum, ama burada biten birçok insanın bu cevabın ne yaptığını görmek istediğini görebiliyorum.
TMH

74

Bu 2018 ECMAScript 6+ Çözümü :

const str = 'the Eiffel Tower';
const newStr = `${str[0].toUpperCase()}${str.slice(1)}`;
console.log('Original String:', str); // the Eiffel Tower
console.log('New String:', newStr); // The Eiffel Tower


5
.slice()daha yavaş gerçekleşiyor .substring(), str[0]olurdu undefinediken, boş bir dize ve burada 8 karakterden iki parça tanıtır katılmak için şablon harfleri kullanarak +sadece 3. getirecek
Przemek

4
Cevabım Prz, yeni ES6 destekli özellikleri, özellikle diğer yazılarda bahsedilmeyen şablon değişimlerini sergilemektir. StackOverflow fikri araştırmacıya “seçenekler” vermektir. Bu cevapta açıklanan Şablon Değişmezleri kavramını alabilirler ve eğer uygulamaları ekstra kaydedilen milisaniye gerektiriyorsa Dize v. Dilim gibi mikro hız geliştirmeleri ile birleştirebilirler. Cevabım ayrıca hiçbir zaman bir StackOverflow cevabını doğrudan kopyalamamanız gerektiğini gösteren herhangi bir Birim Testi içermiyor. Geliştiricinin cevabımı alacağını ve uyarlayacağını varsayıyorum.
Sterling Bourne

Burada şablon değişmezlerini kullanmaktan hiçbir şey kazanmazsınız ve ${}sadece gürültü ekler. const newStr = str[0].toUpperCase() + str.slice(1);okumak daha kolaydır.
Boris

1
Okumak daha kolay olan şeylere katılmama konusunda anlaşın.
Sterling Bourne

67

Zaten kullanıyorsanız (veya düşünüyorsanız) lodash, çözüm kolaydır:

_.upperFirst('fred');
// => 'Fred'

_.upperFirst('FRED');
// => 'FRED'

_.capitalize('fred') //=> 'Fred'

Dokümanlarına bakın: https://lodash.com/docs#capitalize

_.camelCase('Foo Bar'); //=> 'fooBar'

https://lodash.com/docs/4.15.0#camelCase

_.lowerFirst('Fred');
// => 'fred'

_.lowerFirst('FRED');
// => 'fRED'

_.snakeCase('Foo Bar');
// => 'foo_bar'

İlk büyük harf için vanilya js:

function upperCaseFirst(str){
    return str.charAt(0).toUpperCase() + str.substring(1);
}

11
Çoğu kişi sadece bir dizeyi büyük harfle yazmak için bir çerçeve indirmeyeceği için tercih vanilya Js için bence.
GGG

7
Şimdiye kadarki tüm projelerimde asla sadakat kullanmadım. Google'daki çoğu kişinin bu sayfada sona ereceğini ve bir çerçeveyi alternatif olarak listelemenin iyi olduğunu, ancak ana cevap olarak olmadığını unutmayın.
GGG

2
Diğer cevaplar vanilya js kullandığından, birçoğumuz lodash / alt çizgi kullandığımız için böyle bir cevap almak güzel.
Lu Roman

1
Bu, OP'nin şu an Javascript'te yapmasını istediği gibi doğru bir cevap değildir, projenizin bir bağımlılığı olarak tüm kütüphaneyi içe aktaran bir Javascript kütüphanesi değildir. Kullanma.
dudewad

1
OP'nin sorusu cevabımın sonunda vanilyada.
chovy

62

Bir dizedeki tüm kelimelerin ilk harfini büyük yaz:

function ucFirstAllWords( str )
{
    var pieces = str.split(" ");
    for ( var i = 0; i < pieces.length; i++ )
    {
        var j = pieces[i].charAt(0).toUpperCase();
        pieces[i] = j + pieces[i].substr(1);
    }
    return pieces.join(" ");
}

14
Soruyu yeniden oku: Bir dizenin ilk karakterini büyük harf yapmak istiyorum, ancak diğer harflerin herhangi birinin durumunu değiştirmem.
JimmyPena

2
Yaptığımı biliyorum. Tüm dize büyük harfle başlar, bir şey eklemek istiyorum: pieces [i] = j + adet [i] .substr (1) .toLowerCase ();
Malovich

4
Bu duruma başka bir çözüm: capitaliseFirstLetters (s) {return s.split ("") .map (function (w) {return w.charAt (0) .toUpperCase () + w.substr (1)}) join. ("")} Bir işleve dahil edilmezse güzel bir astar olabilir.
Luke Channings

Tüm ipi ilk önce küçük harflerle yazmak daha iyi olur
Magico

Soruyu cevaplamayan bu fonksiyon dışında, aslında aşırı karmaşıktır. s => s.split(' ').map(x => x[0].toUpperCase() + x.slice(1)).join(' ')
OverCoder

48

İlk karakteri favorilerimden biriyle alabilirdik, RegExpsevimli bir surat gibi görünüyor:/^./

String.prototype.capitalize = function () {
  return this.replace(/^./, function (match) {
    return match.toUpperCase();
  });
};

Ve tüm kahve bağımlıları için:

String::capitalize = ->
  @replace /^./, (match) ->
    match.toUpperCase()

... yerel prototipleri genişletmeden bunu yapmanın daha iyi bir yolu olduğunu düşünen tüm erkekler için:

var capitalize = function (input) {
  return input.replace(/^./, function (match) {
    return match.toUpperCase();
  });
};

2
String prototipini değiştirmeden bunu yapmanın daha iyi bir yolu vardır.
Büyük McLargeHuge

2
@ davidkennedy85 Elbette! Ama bu basit yol, en iyi yol değil ... ;-)
yckart

Sevgili efendim, bu sorunun milyonlarca cevabı var! Çözümünüz es6'da daha da güzel görünüyor. 'Answer'.replace(/^./, v => v.toLowerCase())
stwilz

47

kullanın:

var str = "ruby java";

console.log(str.charAt(0).toUpperCase() + str.substring(1));

Bu çıktıyı olacak "Ruby java"konsola.


Tek hat çözümü.
Ahmed Şerif

45

Eğer kullanırsanız underscore.js veya Lo-Dash , underscore.string kütüphane yararlanmak dahil dize uzantıları sağlar:

_.capitalize (string) Dizenin ilk harfini büyük harfe dönüştürür.

Misal:

_.capitalize("foo bar") == "Foo bar"

3
3.0.0 sürümünden beri, Lo-Dash varsayılan olarak bu dize yöntemine sahiptir. Tıpkı bu yanıt açıklandığı: _.capitalize("foo") === "Foo".
bardzusny

Ayrıca, yararlı underscore.js işlevi denir humanize. Altı çizili, deve veya kalıtsal bir dizgiyi insancıllaştırılmış bir dizgiye dönüştürür. Ayrıca, başlangıç ​​ve bitiş boşluklarını kaldırır ve '_id' postfix'ini kaldırır.
Stepan Zakharov

1
Sürüm 4 * 'ten itibaren, Lodash diğer harfleri de küçük harfle () dikkat edin!
Igor Loskutov

45
String.prototype.capitalize = function(allWords) {
   return (allWords) ? // if all words
      this.split(' ').map(word => word.capitalize()).join(' ') : //break down phrase to words then  recursive calls until capitalizing all words
      this.charAt(0).toUpperCase() + this.slice(1); // if allWords is undefined , capitalize only the first word , mean the first char of the whole string
}

Ve sonra:

 "capitalize just the first word".capitalize(); ==> "Capitalize just the first word"
 "capitalize all words".capitalize(true); ==> "Capitalize All Words"

Kasım 2016 (ES6) güncellemesi, sadece EĞLENCE için:

const capitalize = (string = '') => [...string].map(    //convert to array with each item is a char of string by using spread operator (...)
    (char, index) => index ? char : char.toUpperCase()  // index true means not equal 0 , so (!index) is the first char which is capitalized by `toUpperCase()` method
 ).join('')                                             //return back to string

sonra capitalize("hello") // Hello


3
Bunun iki nedenden dolayı kötü bir çözüm olduğunu düşünüyorum: İlkel bir prototipin değiştirilmesi kötü bir fikir. Spesifikasyon değişirse ve yeni bir proto mülk adı olarak 'büyük harf' seçmeye karar verirse, temel dil işlevini bozuyorsunuz. Ayrıca, seçilen yöntem adı zayıf. İlk bakışta, bunun tüm ipi büyük yazacağını düşünürdüm. PHP'nin ucFirst veya benzeri bir şey gibi daha açıklayıcı bir ad kullanmak daha iyi bir fikir olabilir.
dudewad

Diğer ES6 cevap basittir: const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();.
Dan Dascalescu

44

EN KISA 3 çözümler, 1 ve 2 sap durumlarda zaman sdizedir "", nullve undefined:

 s&&s[0].toUpperCase()+s.slice(1)        // 32 char

 s&&s.replace(/./,s[0].toUpperCase())    // 36 char - using regexp

'foo'.replace(/./,x=>x.toUpperCase())    // 31 char - direct on string, ES6


42

Yalnızca CSS

p::first-letter {
  text-transform: uppercase;
}
  • Çağrılmasına rağmen ::first-letter, ilk karakter için geçerlidir , yani dize durumunda %a, bu seçici büyük harfle uygulanır %ve abüyük harfle yazılmaz.
  • IE9 + veya IE5.5 + 'da eski gösterimlerde yalnızca bir iki nokta üst üste ( :first-letter) ile desteklenir .

ES2015 tek astarlı

Çok sayıda cevap olduğundan, ancak ES2015'te orijinal sorunu etkili bir şekilde çözecek hiçbiri olmadığından, aşağıdakileri buldum:

const capitalizeFirstChar = str => str.charAt(0).toUpperCase() + str.substring(1);

Uyarılar

  • parameters => functionok işlevi denir .
  • Bunun capitalizeFirstCharyerine isimle gittim capitalizeFirstLetter, çünkü OP tüm dizgideki ilk harfi büyük harfle kodlayan kod istemedi, ancak ilk karakter (elbette mektup ise).
  • constcapitalizeFirstCharbir programcı olarak her zaman niyetlerinizi açıkça belirtmeniz gerektiğinden , bize sürekli olarak beyan etme yeteneği verir .
  • Yaptığım karşılaştırmada string.charAt(0)ve arasında anlamlı bir fark yoktu string[0]. Bununla birlikte, bunun boş dize için string[0]olacağını unutmayın, bu undefinedyüzden string && string[0]alternatifle karşılaştırıldığında çok ayrıntılı bir şekilde yeniden yazılmalıdır .
  • string.substring(1)daha hızlıdır string.slice(1).

Karşılaştırma

  • Bu çözelti için 4.956.962 ops / s ±% 3.03,
  • En çok oy alan cevap için 4,577,946 ops / s ±% 1,2.
  • Google Chrome 57'de JSBench.me ile oluşturulmuştur .

Çözümlerin karşılaştırması


@Yeşil: öyle, iki sütunlu seçiciyi belirttiğinizden emin misiniz?
17'de Przemek

1
Aslında artı işaretini (+) ES6'da bir birleştirme yöntemi olarak kullanmak istemezsiniz. Şablon değişmezlerini kullanmak isteyeceksiniz: eslint.org/docs/rules/prefer-template
Sterling Bourne

42

Değiştirerek uygulamanın çok basit bir yolu var . ECMAScript 6 için:

'foo'.replace(/^./, str => str.toUpperCase())

Sonuç:

'Foo'

1
Şimdiye kadar en iyi cevap ve normal ifade lambda sözdizimini göstermek için ekstra puan. Özellikle bunu seviyorum, çünkü her yerde akıcı bir şekilde kesip yapıştırın.
Wade Hatler

Öncekini kullanmak /^[a-z]/i, .alfabe dışında herhangi bir karakteri değiştirmeye çalışmadığından kullanmaktan daha iyi olacaktır
Code Maniac

38

CSS'de daha kolay görünüyor:

<style type="text/css">
    p.capitalize {text-transform:capitalize;}
</style>
<p class="capitalize">This is some text.</p>

Bu, CSS metin dönüştürme özelliğinden ( W3Schools'ta ).


29
@Simon Dizenin mutlaka bir HTML belgesinin parçası olarak çıkacağı söylenmez - CSS yalnızca varsa kullanılacaktır.
Adam Hepton

9
Adam, doğru, ama Javascript'in% 95'inden fazlasının HTML ve CSS ile kullanıldığını tahmin ediyorum. Ne yazık ki, "büyük harf" ifadesi aslında her kelimeyi büyük harfle kullanır , bu nedenle dizenin yalnızca ilk harfini büyük yapmak için JS'ye ihtiyacınız olacaktır.
Simon East

18
Yanlış, Dinesh. Dizenin ilk karakterini söyledi .
Simon East

81
Bu cevap, gülünç sayıda upvote olmasına rağmen, her kelimenin ilk harfini büyük yazacağı için yanlıştır . @Ryan, silerseniz Disiplinli bir rozet kazanırsınız. Lütfen yap.
Dan Dascalescu

10
@DanDascalescu - Katılıyorum Ryan'ın yanıtı tamamen yanlış.
Timo

38
var capitalized = yourstring[0].toUpperCase() + yourstring.substr(1);

38

Astral uçak kodu puanlarıyla ilgili mevcut cevaplarda hiç bir şey görmedim veya uluslararasılaşma . “Büyük harf”, belirli bir komut dosyası kullanarak her dilde aynı anlama gelmez.

Başlangıçta astral uçak kod noktaları ile ilgili sorunları ele alan herhangi bir cevap görmedim. Bir tane var , ama biraz gömülü (sanki böyle olacak, sanırım!)


Önerilen işlevlerin çoğu şöyle görünür:

function capitalizeFirstLetter(str) {
  return str[0].toUpperCase() + str.slice(1);
}

Bununla birlikte, bazı kasalı karakterler BMP'nin dışında kalır (temel çok dilli düzlem, kod noktaları U + 0 ila U + FFFF). Örneğin şu Deseret metnini alın:

capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉"); // "𐐶𐐲𐑌𐐼𐐲𐑉"

Dizelerin dizi dizinli özellikleri “karakterlere” veya kod noktalarına * erişmediği için buradaki ilk karakter büyük harfle yazılmaz. UTF-16 kod birimlerine erişirler. Bu, dilimleme sırasında da geçerlidir - dizin değerleri kod birimlerini gösterir.

UTF-16 kod birimleri, U + 0 ila U + D7FF ve U + E000 ila U + FFFF dahil olmak üzere iki aralıkta USV kod noktalarına sahip 1: 1'dir. Çoğu kasalı karakter bu iki aralığa girer, ancak hepsi değil.

ES2015'ten itibaren bununla başa çıkmak biraz daha kolay oldu. String.prototype[@@iterator]kod noktalarına karşılık gelen dizeler verir **. Örneğin, bunu yapabiliriz:

function capitalizeFirstLetter([ first, ...rest ]) {
  return [ first.toUpperCase(), ...rest ].join('');
}

capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

Daha uzun teller için, bu muhtemelen çok verimli değildir *** - gerisini gerçekten yinelememiz gerekmez. String.prototype.codePointAtİlk (olası) mektuba ulaşmak için kullanabiliriz , ancak dilimin nereden başlaması gerektiğini hala belirlememiz gerekir. Kalanı yinelemekten kaçınmanın bir yolu, ilk kod noktasının BMP dışında olup olmadığını test etmek olacaktır; değilse, dilim 1'den başlar ve öyleyse dilim 2'den başlar.

function capitalizeFirstLetter(str) {
  const firstCP = str.codePointAt(0);
  const index = firstCP > 0xFFFF ? 2 : 1;

  return String.fromCodePoint(firstCP).toUpperCase() + str.slice(index);
}

capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

Bunun yerine bitsel matematiği kullanabilirsiniz > 0xFFFF, ancak muhtemelen bu şekilde anlamak daha kolaydır ve her ikisi de aynı şeyi başarır.

Gerekirse bu mantığı biraz daha ileri götürerek bu çalışmayı ES5 ve aşağısında da yapabiliriz. ES5'te kod noktalarıyla çalışmak için gerçek bir yöntem yoktur, bu nedenle ilk kod biriminin bir vekil olup olmadığını manuel olarak test etmeliyiz ****:

function capitalizeFirstLetter(str) {
  var firstCodeUnit = str[0];

  if (firstCodeUnit < '\uD800' || firstCodeUnit > '\uDFFF') {
    return str[0].toUpperCase() + str.slice(1);
  }

  return str.slice(0, 2).toUpperCase() + str.slice(2);
}

capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

Başlangıçta uluslararasılaşma hususlarından da bahsettim. Bunların bazılarını açıklamak çok zordur, çünkü sadece hangi dilin kullanıldığına dair bilgiye ihtiyaç duymazlar, aynı zamanda dildeki kelimelerin spesifik bilgisini de gerektirebilirler. Örneğin, İrlandalı "mb" digrafisi bir kelimenin başında "mB" olarak büyük harf kullanır. Başka bir örnek, Alman eszett, asla bir kelime (afaik) başlatmaz, ancak yine de sorunu göstermeye yardımcı olur. Küçük eszett (“ß”) “SS” olarak büyük harfle yazılır, ancak “SS”, “ß” veya “ss” ile küçük harfle ifade edilebilir - hangisinin doğru olduğunu bilmek için Almanca dışında bant dışı bilgi sahibi olmanız gerekir!

Bu tür sorunların en ünlü örneği, muhtemelen Türkçedir. Türkçe Latince'de, i'nin büyük şekli İ, i'nin küçük harfi ise - iki farklı harftir. Neyse ki bunu hesaba katmanın bir yolu var:

function capitalizeFirstLetter([ first, ...rest ], locale) {
  return [ first.toLocaleUpperCase(locale), ...rest ].join('');
}

capitalizeFirstLetter("italy", "en") // "Italy"
capitalizeFirstLetter("italya", "tr") // "İtalya"

Bir tarayıcıda, kullanıcının en çok tercih ettiği dil etiketi ile gösterilir navigator.language, tercih sırasına göre bir liste bulunur navigator.languagesve belirli bir DOM öğesinin dili (genellikle) Object(element.closest('[lang]')).lang || YOUR_DEFAULT_HEREçok dilli belgelerde elde edilebilir .

Reg20p'de ES2018'de tanıtılan Unicode özellik karakter sınıflarını destekleyen aracılarda, ilgilendiğimiz karakterleri doğrudan ifade ederek işleri daha da temizleyebiliriz:

function capitalizeFirstLetter(str, locale=navigator.language) {
  return str.replace(/^\p{CWU}/u, char => char.toLocaleUpperCase(locale));
}

Bu, bir dizede birden çok kelimeyi büyük harflerle oldukça iyi bir doğrulukla ele almak için biraz değiştirilebilir. CWUYa Changes_When_Uppercased karakter özelliği, iyi, değişim Büyük harfli tüm kod noktalarını eşleşir. Bunu Flemenkçe ij gibi başlıklı digraph karakterleriyle deneyebiliriz , örneğin:

capitalizeFirstLetter('ijsselmeer'); // "IJsselmeer"

Yazma sırasında (Şubat 2020), Firefox / Spidermonkey henüz son iki yılda tanıtılan RegExp özelliklerinden hiçbirini uygulamadı *****. Bu özelliğin mevcut durumunu Kangax uyumlu tablodan kontrol edebilirsiniz . Babel, RegExp değişmez değerlerini bunlar olmadan eşdeğer kalıplara özellik başvurularıyla derleyebilir, ancak ortaya çıkan kodun çok büyük olabileceğini unutmayın.


Büyük olasılıkla, bu soruyu soran insanlar Deseret kapitalizasyonu veya uluslararasılaşmasıyla ilgilenmeyecektir. Ancak bu sorunların farkında olmak iyidir, çünkü şu anda endişe olmasalar bile, sonunda karşılaşma şansınız yüksektir. Onlar “uç” vakalar değiller, daha doğrusu, tanım gereği uç vakalar değiller - zaten çoğu insanın Türkçe konuştuğu ve kod noktalarıyla kod birimlerini karıştırmanın oldukça yaygın bir hata kaynağı olduğu bir ülke var (özellikle emoji ile ilgili). Hem teller hem de dil oldukça karmaşık!


* UTF-16 / UCS2'nin kod birimleri de Unicode kod noktalarıdır, örneğin U + D800 teknik olarak bir kod noktasıdır, ancak burada "ne demek" değildir ... bulanık. Suretler kesinlikle değildir, USV'lerdir (Unicode skaler değerleri).

** Bir vekil kod birimi “yetim” ise - yani mantıklı bir çiftin parçası olmasa da - burada da vekil alabilirsiniz.

*** olabilir. Test etmedim. Büyük harf kullanımını anlamlı bir darboğaz olarak belirlemediyseniz, muhtemelen terlemezdim - en net ve okunabilir olduğuna inandığınız her şeyi seçin.

**** böyle bir işlev, ilk birimin yetim bir vekil olması mümkün olduğundan, sadece birincisi yerine hem birinci hem de ikinci kod birimlerini test etmek isteyebilir. Örneğin "\ uD800x" girdisi, X'i olduğu gibi büyük harflerle yazılır ve bu beklenen veya beklenmeyebilir.

***** İşte ilerlemeyi daha doğrudan takip etmek istiyorsanız Bugzilla sorunu .


2
Bu cevabın öne taşınması gerekiyor.
Rúnar Berg

Teşekkürler @ RúnarBerg - Yorumunuz bana bunu hatırlattığından, tekrar okudum ve bahsetmeye değer bir dava ve çözüm bıraktığımı fark ettim. Ayrıca bazı terminolojiyi daha iyi açıklamaya çalıştık.
Semicolon

Harika cevap .....
Ben Aston

Bu cevap mükemmel, keşke daha fazla değerlendirebilsem.
David Barker

37

Bu tür şeyleri önce CSS kullanarak ele almak her zaman daha iyidir , genel olarak, CSS kullanarak bir şey çözebilirseniz, önce bunu yapın, sonra sorunlarınızı çözmek için JavaScript'i deneyin, bu durumda :first-letterCSS'de kullanmayı deneyin ve uygulayıntext-transform:capitalize;

Bunun için bir sınıf oluşturmayı deneyin, böylece onu global olarak kullanabilirsiniz, örneğin: .first-letter-uppercaseve CSS'nize aşağıdaki gibi bir şey ekleyin:

.first-letter-uppercase:first-letter {
    text-transform:capitalize;
}

Ayrıca alternatif seçenek JavaScript'tir, bu yüzden en iyisi böyle bir şey olacaktır:

function capitalizeTxt(txt) {
  return txt.charAt(0).toUpperCase() + txt.slice(1); //or if you want lowercase the rest txt.slice(1).toLowerCase();
}

ve şöyle deyin:

capitalizeTxt('this is a test'); // return 'This is a test'
capitalizeTxt('the Eiffel Tower'); // return 'The Eiffel Tower'
capitalizeTxt('/index.html');  // return '/index.html'
capitalizeTxt('alireza');  // return 'Alireza'

Tekrar tekrar kullanmak isterseniz, javascript native String'e eklemeniz daha iyidir, bu yüzden aşağıdaki gibi bir şey:

String.prototype.capitalizeTxt = String.prototype.capitalizeTxt || function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
}

ve aşağıdaki gibi arayın:

'this is a test'.capitalizeTxt(); // return 'This is a test'
'the Eiffel Tower'.capitalizeTxt(); // return 'The Eiffel Tower'
'/index.html'.capitalizeTxt();  // return '/index.html'
'alireza'.capitalizeTxt();  // return 'Alireza'

36

Tümü büyük harf olan metni yeniden biçimlendirmek istiyorsanız, diğer örnekleri aşağıdaki gibi değiştirmek isteyebilirsiniz:

function capitalize (text) {
    return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
}

Bu, aşağıdaki metnin değiştirilmesini sağlayacaktır:

TEST => Test
This Is A TeST => This is a test

Muhtemelen bunun kısaltmalar gibi şeyleri küçük harfe çevireceğini de belirtmek gerekir, bu yüzden çoğu durumda en iyi fikir
olmayabilir

Ayrıca, GAMITG, gönderinin kod olmayan bir bölümünden bir boşluk boşluğunu kaldırmak için gerçekten bir düzenleme yaptı mı? O_O
monokrome

btw, bu büyük harf kısaltmalarını kıracak, bu yüzden hepinize dikkat edin <3
monokrome

34
function capitalize(s) {
    // returns the first letter capitalized + the string from index 1 and out aka. the rest of the string
    return s[0].toUpperCase() + s.substr(1);
}


// examples
capitalize('this is a test');
=> 'This is a test'

capitalize('the Eiffel Tower');
=> 'The Eiffel Tower'

capitalize('/index.html');
=> '/index.html'

@Ram işlemi tamamlandı. Ayrıca örnekler dahil.
Fredrik

Bu 2009 cevabından nasıl daha iyi ?
Dan Dascalescu

1
@DanDascalescu değil. Sanırım bunun aksine substr/ substringbiraz daha semantik olduğunu iddia edebilirsiniz slice, ama bu sadece bir tercih meselesi. Ancak, '09 örneğinde bulunmayan hoş bir dokunuş olan soruda verilen dizelerle örnekler verdim. Dürüstçe ben StackOverflow;) karma isteyen 15 yaşındaki bana kaynar düşünüyorum
Fredrik A.

34

İşte ucfirst () adlı bir işlev ( "büyük harf ilk harfi" kısaltması):

function ucfirst(str) {
    var firstLetter = str.substr(0, 1);
    return firstLetter.toUpperCase() + str.substr(1);
}

Bir dizeyi ucfirst ("bazı dize") çağırarak büyük harflerle yazabilirsiniz - örneğin,

ucfirst("this is a test") --> "This is a test"

Dizeyi iki parçaya bölerek çalışır. İlk satırda firstLetter öğesini çıkarır ve sonra ikinci satırda firstLetter öğesini firstLetter.toUpperCase () öğesini çağırarak büyük harfle yazır ve str.substr (1) öğesini çağırarak bulunan dizenin geri kalanıyla birleştirir .

Bunun boş bir dize için başarısız olacağını düşünebilirsiniz ve gerçekten de C gibi bir dilde bunun için yiyecek ve içecek sağlamak zorunda kalacaksınız. Ancak JavaScript'te, boş bir dizenin alt dizesini aldığınızda, boş bir dize alırsınız.


4
String.substring () veya String.slice () kullanın ... substr () kullanmayın - kullanımdan kaldırılmıştır.
James

7
@ 999: Kullanımdan substr()kaldırıldığı nereden bahsediyor? O değil Bu yorumu yaptığında, şimdi bile, üç yıl sonra, 2009 yılında tek başına geri verelim.
Dan Dascalescu

substr()herhangi bir popüler ECMAScript uygulaması tarafından kullanımdan kaldırılmış olarak işaretlenmeyebilir (yakın zamanda yok olmayacağından şüpheliyim), ancak ECMAScript spesifikasyonunun bir parçası değildir. Spesifikasyonların 3. baskısı, "özellikleri veya anlamlarını bu standardın bir parçası haline getirmeden bu tür özellikler için tek biçimli anlambilim önermek" için normatif olmayan ekte belirtilmiştir.
Peter Rust

2
Aynı şeyi yapmak (3 yöntemi olması, substring, substrve slice) IMO, çok fazla. Her zaman slicenegatif dizinleri desteklediğinden, kafa karıştırıcı arg-swapping davranışına sahip olmadığı ve API'sinin slicediğer dillerde benzer olduğu için kullanıyorum .
Peter Rust

29
String.prototype.capitalize = function(){
    return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase();
    } );
};

Kullanımı:

capitalizedString = someString.capitalize();

Bu bir metin dizesidir => Bu Bir Metin Dizesidir


20
Bunun için düzenli ifadeler aşırıya kaçıyor.
Anthony Sottile

+1, gerçekten aradığım şey buydu. Küçük bir hata olsa da, olması gerekir return.this.toLocaleLowerCase().replace(...
tomdemuyt

+1, bu sayfayı phps ucfirst'ın javascript sürümünü arıyorum, çoğu insanın nasıl bulduğundan şüphelendim.
Benubird

@DanDascalescu Bunu yararlı buldum, bu yüzden +1 faydacılık ve -1 anal-kalıcılık. Bir örnek ekledi, bu yüzden işlevi açık.
Travis Webb

String.prototype.capitalize = function(){ return this.replace( /(^|\s)[a-z]/g , function(m){ return m.toUpperCase(); }); }; Kodunuzu biraz yeniden düzenledim, sadece ilk eşleşmeye ihtiyacınız var.
IGRACH

28
var str = "test string";
str = str.substring(0,1).toUpperCase() + str.substring(1);

21

Bu çözümü inceleyin:

var stringVal = 'master';
stringVal.replace(/^./, stringVal[0].toUpperCase()); // returns Master 

3
Bu kabul edilen cevap olmalı. Ana çözüm alt çizgi gibi bir çerçeve kullanmamalıdır.
Adam McArthur

3
Bazı tuş vuruşlarını kaydedin;)stringVal.replace(/^./, stringVal[0].toUpperCase());
Alfredo Delgado

1
Regex gerekli olmayan yerlerde kullanılmamalıdır. Büyük ölçüde verimsiz ve kodu daha özlü hale getirmiyor. Dahası, boş stringVal[0]olur ve mülkiyete erişme girişimi bir hata verir. undefinedstringVal.toUpperCase()
Przemek

20
yourString.replace(/^[a-z]/, function(m){ return m.toUpperCase() });

(Sık sık kullanırsanız, onu bir işleve kapsülleyebilir veya hatta String prototipine ekleyebilirsiniz.)


5
Bu oy çok olsa da, bu burada yayınlanan en yavaş çözüm. Bu yazının
Robin van Baalen

@RobinvanBaalen Bağlantınız kesildi. Güncellenmiş bir tane var mı?
Brad

1
Regexp bunun için aşırıya kaçıyor, daha basit olanı tercih edin: str.charAt (0) .toUpperCase () + str.slice (1)
Simon

@Brad maalesef değil
Robin van Baalen

Çoğu zaman, regex ile sorununuzu çözmek istiyorsanız, iki sorunla sonuçlanırsınız.
Przemek

19

Bu şekilde ucfirstyaparsanız işlev çalışır.

function ucfirst(str) {
    var firstLetter = str.slice(0,1);
    return firstLetter.toUpperCase() + str.substring(1);
}

Bildirim için teşekkürler JP.


2
fonksiyon için güzel bir isim! Adı PHP eşdeğeriyle aynıdır. Aslında JS'de yazılmış PHP işlevlerinin tam bir kütüphanesi vardır; PHP.js olarak adlandırılır ve http://phpjs.org adresinde
Hussam

11
Bir astar:string[0].toUpperCase() + string.substring(1)
dr.dimitru

@TarranJones burada kurşun geçirmez bir astar:(string[0] || '').toUpperCase() + string.substring(1)
dr.dimitru

@ dr.dimitru: Deyimsel yerine (string[0] || '')sadece yapabilirsiniz string.charAt(0).
17'de Przemek


17
yourString.replace(/\w/, c => c.toUpperCase())

Bu ok işlevini en kolay buldum. Değiştir\w , dizenizin ilk harf karakteri ( ) ile eşleşir ve büyük harfe dönüştürür. Hiçbir meraklısı gerekli.


1
Bu kabul edilen cevap olmalı, bunun yerine SO son moda soruları vermeye devam ettiğinden neredeyse sonuncusu. Btw, /./iki nedenden dolayı kullanmak daha iyi : /\w/önceki tüm harf olmayan karakterleri atlayacak (yani @@ abc @@ Abc olacak) ve daha sonra latin olmayan karakterler ile çalışmaz
Cristian Traìna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.