JavaScript에서 문자열의 첫 글자를 대문자로 만들려면 어떻게합니까?


3758

문자열의 첫 글자를 대문자로 만들려면 어떻게해야합니까?

예를 들면 다음과 같습니다.

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

12
Underscore 에는 underscore.string 이라는 플러그인 이 있으며 여기에는 여러 가지 훌륭한 도구가 포함되어 있습니다.
Aaron

대해 :return str.replace(/(\b\w)/gi,function(m){return m.toUpperCase();});
무하마드 Umer

110
더 단순 :string[0].toUpperCase() + string.substring(1)
dr.dimitru

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

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

답변:


5806

기본 솔루션은 다음과 같습니다.

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

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

다른 답변은 수정하지만 String.prototype(이 답변은 예전에도 사용되었지만) 유지 관리 가능성으로 인해이 문제에 대해 조언 할 것입니다 (함수가 추가되는 위치를 찾기가 어렵고 prototype다른 코드가 동일한 이름 / 브라우저를 사용하는 경우 충돌을 일으킬 수 있음) 나중에 같은 이름의 기본 함수를 추가합니다).

... 그리고 국제화를 고려할 때이 질문에 훨씬 더 많은 것이 있습니다. 이 놀라운 대답 (아래에 묻혀 있음)이 보여줍니다.

코드 단위 대신 유니 코드 코드 포인트로 작업하려는 경우 (예 : 기본 다국어 평면 외부에서 유니 코드 문자를 처리하는 경우) String#[@iterator]코드 포인트와 작동 하는 사실을 활용할 수 있으며 toLocaleUpperCase로케일이 올바른 대문자를 얻을 수 있습니다 .

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!)

더 많은 국제화 옵션에 대해서는 아래원래 답변을 참조하십시오 .


9
substring은 substr보다 더 많은 브라우저에서 이해됩니다
mplungjan

6
karim79에 추가하려면-자바 스크립트가 함수 줄 바꿈없이 변수에 대해 동일한 작업을 수행하므로 함수를 만드는 것이 과도합니다. 함수를 사용하면 더 명확하다고 생각하지만 그렇지 않은 경우 함수 래퍼와 왜 복잡합니까?
Ross

18
우리는 또한 slice (1)을 낮추어야합니까?
hasen jan

177
OP는 다음 예제를 제공했기 때문에 아니요 the Eiffel Tower -> The Eiffel Tower. 또한이 함수는 capitaliseFirstLetternot 이라고 capitaliseFirstLetterAndLowerCaseAllTheOthers합니다.
금지 지오 엔지니어링

22
아무도 OOP의 중요한 규칙에 관심이 없습니까? - 소유하지 않은 개체를 편집하지 않습니까? . BTW,이 한 줄 훨씬 더 우아한 같다 :string[0].toUpperCase() + string.substring(1)
dr.dimitru

1349

보다 객체 지향적 인 접근 방식은 다음과 같습니다.

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

다음과 같이 함수를 호출합니다.

"hello world".capitalize();

예상되는 결과는 다음과 같습니다.

"Hello world" 

24
나는이 솔루션이 Ruby와 같고 Ruby가 달콤하다는 것을 좋아합니다! :) 나는 문자열의 다른 모든 문자를 소문자로 바꾸어 Ruby처럼 정확하게 작동한다 :return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
ma11hew28

164
이 post-Prototype.js 세계에서는 기본 객체를 변경하거나 확장하지 않는 것이 좋습니다.
Ryan

191
@rxgx- "확장하지 마십시오"boogeyman은 이제 죽기 시작했고 (신께 감사합니다.) 사람들은 jSand에서 머리를 꺼내어 언어 기능이라는 것을 깨달았습니다. Prototype.js가 짧은 시간 동안 Object 자체를 확장했다고해서 Natives 확장이 나쁘다는 의미는 아닙니다. 알 수없는 소비자 (임의 사이트로 이동하는 분석 스크립트 등)를위한 코드를 작성하는 경우에는 그렇게하지 말아야합니다.
csuwldcat 2016 년

43
@csuwldcat 사용하고있는 다른 라이브러리가 자신도 모르게 자체 대문자를 추가하면 어떻게됩니까? Prototype.js가 수행했는지 여부에 관계없이 프로토 타입 확장은 잘못된 형식입니다. ES6을 사용하면 내장 함수를 사용하여 케이크를 먹고 먹을 수도 있습니다. ECMASCRIPT 사양을 준수하는 심을 만드는 사람들을 위해 "부기맨 (boogeyman)"이 혼란 스러울 수 있다고 생각합니다. 이 shim은 shim을 추가 한 다른 라이브러리가 동일한 방식으로 구현하기 때문에 완벽하게 좋습니다. 그러나 고유하지 않은 고유 기능을 추가하지 않아야합니다.
저스틴 메이어

43
원주민 확장은 매우 나쁜 습관입니다. "아무도이 코드를 다른 용도로 사용하지 않을 것"이라고 말하더라도 귀하 (또는 다른 사람)는 아마도 그렇게 할 것입니다. 그런 다음 누군가가 Number.money ()를 확장하여 다른 라이브러리와 약간 다른 통화를 처리하기 때문에 이상한 수학 버그를 알아 내려고 3 일을 소비합니다. 진지하게, 나는 이것이 큰 회사에서 발생하는 것을 보았고 원주민 프로토 타입으로 엉망이 된 라이브러리를 알아내는 데 시간을 투자 할 가치가 없습니다.
phreakhead

573

CSS에서 :

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

80
OP는 JS 솔루션을 요구하고 있습니다.
안토니오 맥스

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

21
또한 실제 값이 아닌 문자열 표시에만 영향을줍니다. 예를 들어 양식 인 경우 값은 그대로 제출됩니다.
dmansfield 2016 년

12
이 답변은 CSS 솔루션이 내가하고있는 일에 실제로 더 적합하다는 것을 깨달았습니다. @dudewad : 대답은 아마도 이것이 JS 솔루션은 아니지만 필요에 따라 더 적절하다는 면책 조항을 제공해야합니다.
joshden

58
이 질문에 대한 시청자의 약 80 %가 이것이 가장 좋은 답변이 될 것입니다. 받는 않음 대답 질문 만에 문제 대신.
Jivan

290

다음은 문자열을 배열로 취급하여 첫 글자를 얻는 인기있는 답변의 단축 버전입니다.

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

최신 정보:

아래 의견에 따르면 IE 7 이하에서는 작동하지 않습니다.

업데이트 2 :

undefined빈 문자열 을 피하려면 (아래 @ njzk2의 주석 참조 ) 빈 문자열을 확인할 수 있습니다.

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

23
브라우저는 문자열 인덱싱을 지원하지 않으므로 IE <8에서는 작동하지 않습니다. IE8 자체는이를 지원하지만 문자열 객체에 대해서는 문자열 리터럴에 대해서만 지원합니다.
Mathias Bynens

52
IE7 시장은 5 % 미만입니다. 그리고 아마도 당신의 gremma와 grempa의 오래된 기계 일 것입니다. 나는 짧은 코드 FTW를 말한다!
vsync December

@MathiasBynens 이것이 오래된 비 IE 브라우저 나 IE7에 영향을 미치는지 알고 있습니까? 2014 년에 문자열 리터럴 인덱싱의 영향을받는 다른 브라우저가 없다면 괜찮을 것입니다. :)
hexalys

3
@vsync 나는 단지 사용자 인구 통계에 따라, 때로는 (2014 년 이후에도 감사 할 정도로 적지 만) IE7과 같은 오래된 브라우저를 지원하는 것이 유리하다는 것을 의미했습니다.
joshuahedlund

2
@ njzk2는 빈 문자열을 처리하기 위해 다음과 같이 업데이트 할 수 있습니다. return s && s[0].toUpperCase() + s.slice(1);
joelvh

188

게시 된 몇 가지 다른 방법의 성능에 관심이있는 경우 :

이 jsperf 테스트를 기반으로 가장 빠른 방법은 다음과 같습니다 (가장 빠른 순서에서 가장 느린 순서로).

보시다시피 처음 두 가지 방법은 본질적으로 성능 측면에서 비교할 수 있지만 변경 방법은 성능 측면 String.prototype에서 가장 느립니다.

// 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);
}

여기에 이미지 설명을 입력하십시오


1
초기화 코드도 차이를 만들지 않는 것 같습니다. jsperf.com/capitalize-first-letter-of-string/2
user420667

6
또한로 교체 .slice(1)하면 .substr(1)성능이 더욱 향상 될 수 있습니다.
Przemek

2
합리적인 고려. 많은 경우 성능 저하가 눈에 띄지 않습니다. "가장 느린"접근 방식조차도 10ms에서 19k 문자열을 처리합니다. 가장 편한 것을 사용하십시오.
Quoting Eddie

1
지난 4 년 동안이 성능이 어떻게 향상되었는지 궁금한 사람이 있다면 2018 년 맥북 프로에서 세 번째 기능의 ops / sec는 135,307,869로 기본적으로 12.4 배 더 빠릅니다.
Carlo Field

151

다른 경우에는 첫 글자를 대문자로하고 나머지는 소문자로 사용해야합니다. 다음과 같은 경우이 기능을 변경했습니다.

//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
"...하지만 다른 문자의 경우는 변경하지 마십시오". OP가 요청한 질문에 대한 정답은 아닙니다.
Carlos Muñoz

2
@ CarlosMuñoz 만약 당신이 첫 문장을 읽으면 이것은 다른 경우를위한 것이라고 말합니다.
TMH

3
@TomHart 이것이 바로 질문에 대한 해결책이 아닌 이유입니다. 코멘트 또는 다른 질문과 답변이되어야합니다
Carlos Muñoz

15
나는 그것에 대해 당신의 의견에 동의하지만, 많은 사람들이이 답변이 무엇을하는지 여기에서 끝나는 것을 볼 수 있습니다.
TMH

74

이것은 2018 ECMAScript 6+ 솔루션입니다 .

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()보다 느린 .substring(), str[0]undefined때, 빈 문자열과 여기에 8 자에서 두 부분을 소개합니다 가입 템플릿 리터럴을 사용하여 +만 3를 소개 것
Przemek

4
내 대답 Prz의 요점은 새로운 ES6 지원 기능, 특히 다른 게시물에서 언급되지 않은 템플릿 리터럴을 보여주는 것입니다. StackOverflow의 개념은 검색 자에게 "옵션"을 제공하는 것입니다. 이 답변에 설명 된 템플릿 리터럴의 개념을 취하여 서브 스트립 v. 슬라이스와 같은 마이크로 스피드 향상 기능과 결합 할 수 있습니다. 내 대답에는 단위 테스트가 포함되어 있지 않으므로 StackOverflow 답변을 직접 복사하여 붙여 넣지 않아야합니다. 나는 개발자가 내 대답을 받아들이고 적응시킬 것이라고 가정합니다.
Sterling Bourne

여기에서 템플릿 리터럴을 사용하면 아무것도 얻지 못하고 ${}소음이 추가됩니다. const newStr = str[0].toUpperCase() + str.slice(1);읽기 쉽습니다.
Boris

1
읽기 쉬운 내용에 동의하지 않는 것에 동의하십시오.
Sterling Bourne

67

이미 사용 중이거나 고려중인 경우 lodash솔루션이 쉽습니다.

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

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

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

문서를 참조하십시오 : 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'

첫 번째 대문자의 바닐라 js :

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

11
대부분의 사람들은 문자열을 대문자로만하기 위해 전체 프레임 워크를 다운로드하지 않기 때문에 바닐라 Js를 선호한다고 생각합니다.
GGG

7
지금까지 모든 프로젝트에서 lodash를 사용한 적이 없습니다. 구글에있는 대부분의 사람들이이 페이지에서 끝날 것이라는 것을 잊지 말고, 대안으로 프레임 워크를 나열하는 것이 좋지만 주된 대답은 아닙니다.
GGG

2
다른 답변은 vanilla js를 사용하기 때문에 많은 사람들이 lodash / underscore를 사용하기 때문에 이와 같은 답변을 얻는 것이 좋습니다.
Lu Roman

1
OP가 전체 라이브러리를 프로젝트에 대한 종속성으로 가져 오는 Javascript 라이브러리가 아닌 Javascript로 요청하기 때문에 정답아닙니다 . 사용하지 마십시오.
dudewad

1
OP의 질문은 답변이 끝날 때 바닐라에 있습니다.
chovy

62

문자열에서 모든 단어의 첫 글자를 대문자로 사용하십시오.

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
질문을 다시 읽으십시오 : 문자열의 첫 문자를 대문자로하고 싶지만 다른 문자의 대소 문자는 변경하지 마십시오.
JimmyPena

2
나도 알아 전체 문자열이 대문자로 시작되는 경우 한 가지를 추가합니다. pieces [i] = j + pieces [i] .substr (1) .toLowerCase ();
Malovich

4
이 경우에 대한 또 다른 솔루션 : function capitaliseFirstLetters (s) {return s.split ( "") .map (function (w) {return w.charAt (0) .toUpperCase () + w.substr (1)}). join ( "")} 함수에 넣지 않으면 멋진 라이너가 될 수 있습니다.
Luke Channings 2013 년

먼저 전체 문자열을 소문자로
만드는

질문에 대답하지 않는이 기능 외에 실제로도 너무 복잡합니다. s => s.split(' ').map(x => x[0].toUpperCase() + x.slice(1)).join(' ')
OverCoder

48

우리는 내가 가장 좋아하는 캐릭터 중 하나를 사용하여 첫 번째 캐릭터를 얻을 수 있습니다 RegExp. 귀여운 스마일처럼 보입니다./^./

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

그리고 모든 커피 중독자들에게 :

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

... 기본 프로토 타입을 확장하지 않고도 더 좋은 방법이 있다고 생각하는 모든 사람들에게 :

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

2
String 프로토 타입을 수정하지 않고이를 수행하는 더 좋은 방법이 있습니다.
Big McLargeHuge

2
트윗 담아 가기 그러나 이것은 간단한 방법이 아닌 것입니다 최고의 ... ;-) 방법
yckart

친애하는 lordy이 질문에 대한 백만 답변이 있습니다! 귀하의 솔루션은 es6에서 더 멋지게 보입니다. 'Answer'.replace(/^./, v => v.toLowerCase())
stwilz

47

사용하다:

var str = "ruby java";

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

"Ruby java"콘솔로 출력 됩니다.


한 줄 솔루션.
Ahmad Sharif

45

당신이 사용하는 경우 underscore.js 또는 소호 - 대쉬underscore.string 라이브러리는 투자를 포함한 문자열 확장을 제공합니다 :

_.capitalize (string) 문자열의 첫 글자를 대문자로 변환합니다.

예:

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

3
버전 3.0.0 부터 Lo-Dash는 기본적으로이 문자열 메소드를 사용할 수 있습니다. 이 답변에 설명 된 것처럼 : _.capitalize("foo") === "Foo".
bardzusny

또한 유용한 underscore.js 함수가 humanize있습니다. 밑줄, 낙타 또는 대시 문자열을 인간화 된 문자열로 변환합니다. 또한 시작 및 끝 공백을 제거하고 접미사 '_id'를 제거합니다.
Stepan Zakharov

1
버전 4 *부터 Lodash는 다른 모든 문자도 소문자 ()로주의하십시오!
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
}

그리고:

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

FUN 전용 2016 년 11 월 (ES6) 업데이트 :

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

그때 capitalize("hello") // Hello


3
필자는 이것이 두 가지 이유로 나쁜 해결책이라고 생각합니다. 사양이 변경되고 '자본화'를 새로운 프로토 속성 이름으로 선택하면 핵심 언어 기능이 작동하지 않는 것입니다. 또한 선택한 분석법 이름이 잘못되었습니다. 언뜻보기에 이것이 전체 문자열을 대문자로 사용할 것이라고 생각합니다. PHP의 ucFirst 또는 이와 유사한 이름을 사용하는 것이 더 좋습니다.
dudewad

다른 ES6 답변은 더 간단 const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();합니다.
Dan Dascalescu

44

최단 3 개 솔루션, 1, 2 핸들 케이스 때 s문자열입니다 "", null그리고 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

CSS 만

p::first-letter {
  text-transform: uppercase;
}
  • 호출 되더라도 ::first-letter첫 번째 문자 , 즉 문자열의 경우에 %a적용됩니다.이 선택기는 다음 %과 같이 적용됩니다.a 대문자로하지 않을 것입니다.
  • IE9 + 또는 IE5.5 +에서는 콜론 ( :first-letter) 이 하나만있는 레거시 표기법으로 지원됩니다 .

ES2015 원 라이너

ES2015에는 원래의 문제를 효율적으로 해결할 수있는 답변이 많지 않기 때문에 다음을 생각해 냈습니다.

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

비고

  • parameters => function화살표 함수 라고 합니다 .
  • OP는 전체 문자열의 첫 번째 문자를 대문자로하는 코드를 요청하지 않았지만 첫 번째 문자 (문자 인 경우 물론)를 요구했기 때문에 이름 capitalizeFirstChar대신 으로 이름 capitalizeFirstLetter을 바꿨습니다.
  • constcapitalizeFirstChar프로그래머로서 항상 의도를 명시 적으로 명시해야하기 때문에 상수 로 선언 할 수 있습니다.
  • 내가 수행 한 벤치 마크에서 string.charAt(0)와 사이에는 큰 차이가 없었습니다 string[0]. 그러나 참고 string[0]가 될 undefined것로 다시 작성해야하므로, 빈 문자열에 대한 string && string[0]대안에 비해 너무 장황하다.
  • string.substring(1)보다 빠릅니다 string.slice(1).

기준

  • 이 솔루션의 경우 4,956,962 ops / s ± 3.03 %,
  • 가장 많이 투표 된 답변에 대해 4,577,946 ops / s ± 1.2 %
  • Chrome 57에서 JSBench.me로 작성되었습니다 .

솔루션 비교


@Green : 그것은 않습니다 , 당신은 두 개의 콜론으로 셀렉터를 지정 하시겠습니까?
Przemek

1
실제로 ES6에서 더하기 기호 (+)를 연결 방법으로 사용하고 싶지 않습니다. 템플릿 리터럴을 사용하려고합니다. eslint.org/docs/rules/prefer-template
Sterling Bourne

42

replace 로 구현하는 매우 간단한 방법이 있습니다. ECMAScript 6의 경우 :

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

결과:

'Foo'

1
정규식 람다 구문을 표시하기위한 최고의 답변과 추가 사항. 나는 유창한 컷 앤 페이스트가 될 수 있기 때문에 특히 이것을 좋아합니다.
웨이드 해 틀러

사용 /^[a-z]/i사용하는 것보다 더 좋을 것 .이전의 하나로 것은 알파벳 이외의 문자를 교체하려고하지 않습니다
코드 미치광이

38

CSS에서 더 쉬운 것 같습니다.

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

CSS 텍스트 변환 속성 ( W3Schools ) 에서 가져온 것 입니다.


28
@Simon 문자열이 반드시 HTML 문서의 일부로 출력 될 것이라고 언급되어 있지는 않습니다. CSS는 그것이 사용될 경우에만 사용될 것입니다.
Adam Hepton

9
Adam, 사실이지만, Javascript의 95 % 이상이 HTML 및 CSS와 함께 사용되는 것 같습니다. 불행히도 "capitalize"문은 실제로 모든 단어 를 대문자로 표시하므로 문자열의 첫 문자 만 대문자로 표시하려면 JS가 필요합니다.
Simon East

18
맞지 않아, 디 네쉬 그는 줄 의 첫 번째 문자를 말했다 .
Simon East

81
이 대답은 어리석은 수의 공언을 가지고 있음에도 불구하고 모든 단어 의 첫 글자를 대문자로 표시하므로 잘못되었습니다 . @Ryan, 삭제하면 훈육 배지를 받습니다. 이렇게하십시오.
Dan Dascalescu

10
@DanDascalescu에 동의하십시오-Ryan의 대답은 완전히 잘못되었습니다.
Timo


38

아스트랄 평면 코드 포인트 또는 관련 문제에 대한 기존 답변에서 언급을 보지 못했습니다. 국제화 . “대문자”는 특정 스크립트를 사용하는 모든 언어에서 동일한 것을 의미하지는 않습니다.

처음에는 아스트랄 평면 코드 포인트와 관련된 문제를 해결하는 답변을 보지 못했습니다. 이 하나 , 그러나 묻혀 약간의 (이 하나가 될 것 같은 것 같아요!)


제안 된 기능의 대부분은 다음과 같습니다.

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

그러나 일부 사례 문자는 BMP (기본 다국어 평면, 코드 포인트 U + 0 ~ U + FFFF)를 벗어납니다. 예를 들어 다음 Deseret 텍스트를 보자.

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

문자열의 배열 색인 속성이 "문자"또는 코드 포인트 *에 액세스하지 않기 때문에 여기서 첫 번째 문자는 대문자로 표시되지 않습니다. UTF-16 코드 단위에 액세스합니다. 슬라이스 할 때도 마찬가지입니다. 인덱스 값은 코드 단위를 가리 킵니다.

UTF-16 코드 단위는 U + 0 ~ U + D7FF 및 U + E000 ~ U + FFFF 포함의 두 범위 내에서 USV 코드 포인트가있는 1 : 1입니다. 대부분의 경우 문자는이 두 범위에 속하지만 전부는 아닙니다.

ES2015부터는 이것을 다루는 것이 약간 쉬워졌습니다. String.prototype[@@iterator]코드 포인트 **에 해당하는 문자열을 생성합니다. 예를 들어 다음과 같이 할 수 있습니다.

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

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

더 긴 문자열의 경우, 아마도 그렇게 효율적이지 않을 것입니다. *** 우리는 실제로 나머지를 반복 할 필요가 없습니다. 우리는 String.prototype.codePointAt첫 번째 (가능한) 편지를 얻는 데 사용할 수 있지만 여전히 슬라이스 시작 위치를 결정해야합니다. 나머지를 반복하지 않는 한 가지 방법은 첫 번째 코드 포인트가 BMP 외부에 있는지 테스트하는 것입니다. 그렇지 않으면 슬라이스는 1에서 시작하고, 그렇지 않으면 슬라이스는 2에서 시작합니다.

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

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

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

대신에 비트 수학을 사용할 수 있습니다 > 0xFFFF 있지만이 방법을 이해하는 것이 더 쉬울 수도 있고 같은 것을 얻을 수도 있습니다.

필요한 경우 해당 논리를 조금 더 발전시켜 ES5 이하에서이 작업을 수행 할 수도 있습니다. ES5에는 코드 포인트 작업을위한 내장 메소드가 없으므로 첫 번째 코드 단위가 대리 ****인지 수동으로 테스트해야합니다.

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("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

처음에는 국제화 고려 사항도 언급했습니다. 이들 중 일부는 무엇에 대한 지식뿐만 아니라 지식이 필요하기 때문에 설명하기가 매우 어렵습니다 언어를 사용하고, 그러나 또한 언어로 단어의 구체적인 지식을 필요로 할 수있다. 예를 들어, 아일랜드어 "mb"는 단어의 시작 부분에서 "mB"로 대문자로 표시됩니다. 또 다른 예인 독일어 eszett는 단어 (afaik)를 시작하지 않지만 여전히 문제를 설명하는 데 도움이됩니다. 소문자 eszett ( "ß")는 "SS"로 대문자를 사용하지만 "SS"는 "ß"또는 "ss"로 소문자를 지정할 수 있습니다. 어떤 언어가 올바른지 알기 위해서는 독일어에 대한 대역 외 지식이 필요합니다!

이러한 종류의 문제 중 가장 유명한 예는 아마도 터키어입니다. 터키어 라틴어에서 i의 대문자는 İ이며 소문자는 ı입니다. 두 개의 다른 문자입니다. 다행히도 우리는 이것을 설명 할 방법이 있습니다.

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

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

브라우저에서 사용자가 가장 선호하는 언어 태그는로 표시되고 navigator.language선호하는 순서대로 목록 이 표시되며 다국어 문서에서 navigator.languages주어진 DOM 요소의 언어를 (일반적으로) 얻을 수 있습니다 Object(element.closest('[lang]')).lang || YOUR_DEFAULT_HERE.

ES2018에 도입 된 RegExp에서 유니 코드 속성 문자 클래스를 지원하는 에이전트에서 관심있는 문자를 직접 표현하여 정리할 수 있습니다.

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

이것은 상당히 좋은 정확도로 문자열에서 여러 단어를 대문자로 처리하도록 약간 조정될 수 있습니다. CWU또는 Changes_When_Uppercased 문자 속성은 물론, 변화 대문자로 모든 코드 포인트와 일치합니다. 예를 들어 Dutch ij 와 같은 제목이있는 digraph 문자를 사용하여이 작업을 시도 할 수 있습니다 .

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

작성 당시 (2020 년 2 월) Firefox / Spidermonkey는 지난 2 년 동안 소개 된 RegExp 기능을 아직 구현하지 않았습니다 *****. Kangax compat 테이블 에서이 기능의 현재 상태를 확인할 수 있습니다 . Babel은 해당 패턴이없는 동등한 패턴에 대한 속성 참조가있는 RegExp 리터럴을 컴파일 할 수 있지만 결과 코드는 엄청날 수 있습니다.


아마이 질문을하는 사람들은 Deseret 대문자 또는 국제화에 관심이 없을 것입니다. 그러나 현재 문제가되지 않더라도 결국에는 문제가 발생할 가능성이 높기 때문에 이러한 문제를 알고있는 것이 좋습니다. 그것들은“가장자리”가 아니고 오히려 정의가 명확한 경우 가 아닙니다 . 대부분의 사람들이 터키어를 사용하는 나라가 있습니다. 어쨌든 코드 단위가있는 코드 단위를 묶는 것은 상당히 일반적인 버그의 원인입니다 (특히 이모티콘과 관련하여). 문자열과 언어는 매우 복잡합니다!


* UTF-16 / UCS2의 코드 단위는 또한 U + D800이 기술적으로 코드 포인트라는 점에서 유니 코드 코드 포인트입니다. 그러나 이것이 "의미"한 것은 아닙니다. 흐린. 그러나 대리자가 확실히 아닌 것은 USV (유니 코드 스칼라 값)입니다.

** 대리 코드 단위가 "분리 된"(즉, 논리 쌍의 일부가 아닌) 경우에도 여전히 대리자를 얻을 수 있습니다.

*** 아마도. 나는 그것을 테스트하지 않았습니다. 대문자 사용이 의미있는 병목 현상이 아니라면 땀을 흘리지 않을 것입니다. 가장 명확하고 읽기 쉬운 항목을 선택하십시오.

**** 이러한 함수는 첫 번째 단위가 분리 된 대리 일 가능성이 있기 때문에 첫 번째 코드 대신 첫 번째 코드 단위와 두 번째 코드 단위를 모두 테스트하려고 할 수 있습니다. 예를 들어 입력 "\ uD800x"는 X를 그대로 대문자로 표시하므로 예상되거나 예상되지 않을 수 있습니다.

***** 진행 상황을 더 직접적으로 따르고 싶다면 Bugzilla 문제 가 있습니다.


2
이 답변은 앞으로 이동해야합니다.
Rúnar Berg

@ RúnarBerg에게 감사드립니다. 귀하의 의견이이 사실을 상기시켜 주었으므로 다시 읽었으며 언급 할 가치가있는 최종 사례와 솔루션을 생략했음을 깨달았습니다. 또한 일부 용어를 더 잘 설명하려고 노력했습니다.
세미콜론

정답 .....
벤 애스턴

이 답변은 훌륭합니다. 더 많이 투표 할 수 있기를 바랍니다.
David Barker

37

CSS를 사용하여 이러한 종류의 물건을 처리하는 것이 좋습니다 . 일반적으로 CSS를 사용하여 무언가를 해결할 수 있다면 먼저 시도한 다음 JavaScript를 사용하여 문제를 해결하십시오.이 경우 :first-letterCSS에서 사용 하고 적용하십시오text-transform:capitalize;

따라서 클래스를 만들어보십시오. 예를 들어 다음 .first-letter-uppercase과 같이 전역 적으로 사용할 수 있습니다 .CSS에 아래와 같은 것을 추가하십시오.

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

또한 대체 옵션은 JavaScript이므로 다음과 같은 것이 가장 좋습니다.

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

다음과 같이 호출하십시오.

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'

반복해서 재사용하려면 자바 스크립트 네이티브 문자열에 첨부하는 것이 좋습니다.

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

아래와 같이 호출하십시오.

'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

모든 대문자 텍스트를 다시 포맷하려면 다른 예제를 다음과 같이 수정하십시오.

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

그러면 다음 텍스트가 변경됩니다.

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

이것은 또한 대부분의 경우, 소문자 약어 같은 아마 좋은 생각을 가지 변환됩니다 것을주의 아마 가치
monokrome

또한 GAMITG 가 게시물의 비 코드 부분에서 공백을 제거하기 위해 실제로 편집 했습니까? O_O
monokrome

btw, 이것은 대문자로 된 약어를 ​​깰 것이므로 조심하십시오 <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'

@ 램 완료 또한 예제가 포함되어 있습니다.
Fredrik A.

2009 년 답변 보다이 점이 더 낫 습니까?
Dan Dascalescu

1
@DanDascalescu가 아닙니다. 나는 당신이 substr/ substring에 비해 약간 더 의미 론적 이라고 주장 할 수 있다고 생각 slice하지만, 그것은 단지 선호의 문제입니다. 그러나 질문에 제공된 문자열이 포함 된 예제를 포함 시켰습니다 .'09 예제에는없는 멋진 터치입니다. 나는 솔직히 그것이 StackOverflow에서 업장을 원하고 15 세로 줄었다 고 생각합니다.)
Fredrik A.

34

다음은 ucfirst () 라는 함수 입니다 ( "대문자 첫 글자"의 줄임말).

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

ucfirst ( "some string") 를 호출하여 문자열을 대문자로 지정할 수 있습니다 ( 예 :

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

문자열을 두 조각으로 나눠서 작동합니다. 첫 번째 줄에서 firstLetter 를 가져온 다음 두 번째 줄에서 firstLetter.toUpperCase () 를 호출 하여 firstLetter 를 대문자 만들고 str.substr (1) 을 호출하여 찾은 나머지 문자열과 조인합니다 .

빈 문자열에서는 이것이 실패한다고 생각할 수 있으며 실제로 C와 같은 언어에서는이를 충족시켜야합니다. 그러나 JavaScript에서 빈 문자열의 하위 문자열을 가져 오면 빈 문자열이 다시 나타납니다.


4
String.substring () 또는 String.slice () 사용 ... substr ()을 사용하지 마십시오. 더 이상 사용되지 않습니다.
James

7
@ 999 : substr()더 이상 사용되지 않는다고 말 합니까? 그렇지 않아 이 댓글을했을 때, 지금도 3 년 후, 2009 년에 다시 혼자하자.
Dan Dascalescu

substr()널리 사용되는 ECMAScript 구현에서 더 이상 사용되지 않는 것으로 표시되지 않을 수 있지만 (곧 사라지지 않을 것으로 의심됩니다) ECMAScript 사양의 일부가 아닙니다. 이 스펙의 제 3 판은 "규범의 특성 또는 그 의미론을 구성하지 않고 그러한 특성에 대한 균일 한 의미론을 제안하기"위해 비 규범 적 부록에서 언급하고있다.
피터 러스트

2
같은 일을하는 세 가지 방법 ( substring, substrslice)이 너무 많습니다 (IMO). slice음수 인덱스를 지원 하기 때문에 항상 사용 하며 혼란스러운 인수 교환 동작이 없으며 API는 slice다른 언어 와 유사합니다 .
피터 러스트

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

용법:

capitalizedString = someString.capitalize();

이것은 텍스트 문자열입니다 => 이것은 텍스트 문자열입니다


20
정규 표현식이 너무 과도합니다.
Anthony Sottile 2016 년

+1, 이것이 내가 정말로 찾고 있었던 것입니다. 사소한 버그가 있지만 return.this.toLocaleLowerCase().replace(...
tomdemuyt

+1, 나는이 페이지가 phps ucfirst의 자바 스크립트 버전을 찾고 있음을 발견했습니다. 대부분의 사람들이 그것을 찾는 방법이 의심 스럽습니다.
Benubird

@ DanDascalescu 나는 이것이 유용하다는 것을 알았으므로 +1 공리주의와 -1 항문 보유력. 그는 예를 포함 시켰으므로 그 기능은 명확하다.
Travis Webb

String.prototype.capitalize = function(){ return this.replace( /(^|\s)[a-z]/g , function(m){ return m.toUpperCase(); }); }; 코드를 약간 리팩터링하면 첫 번째 일치 만 필요합니다.
IGRACH

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

21

이 솔루션을 확인하십시오.

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

3
이것이 정답입니다. 주요 솔루션은 밑줄과 같은 프레임 워크를 사용해서는 안됩니다.
Adam McArthur

3
일부 키 입력을 저장)stringVal.replace(/^./, stringVal[0].toUpperCase());
알프레도 델가도에게

1
필요없는 경우 정규식을 사용해서는 안됩니다. 비효율적이며 코드를 더 간결하게 만들지 않습니다. 또한, stringVal[0]undefined빈을 위해 stringVal, 액세스 속성에 같은 시도와 같은 .toUpperCase()오류가 발생합니다.
Przemek

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

자주 사용하는 경우 함수로 캡슐화하거나 문자열 프로토 타입에 추가 할 수도 있습니다.


5
이것은 꽤 많은 투표권을 가지고 있지만, 여기에 게시 된 가장 느린 해결책입니다. 여기,이 게시물에서 함께 가장 인기있는 답변 좀 speedtest을 넣어했습니다 forwebonly.com/...
로빈 반 Baalen

@RobinvanBaalen 링크가 깨졌습니다. 업데이트 된 것이 있습니까?
Brad

1
정규 표현식이 너무 과잉입니다. str.charAt (0) .toUpperCase () + str.slice (1)
Simon


종종 정규 표현식으로 문제를 해결하려면 두 가지 문제가 발생합니다.
Przemek

19

ucfirst작업을 수행하면 이 기능이 작동합니다.

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

설명을 해주셔서 감사합니다.


2
기능에 대한 좋은 이름! 이름은 PHP와 동일합니다. 실제로 JS로 작성된 전체 PHP 함수 라이브러리가 있습니다. PHP.js라고하며 http://phpjs.org
Hussam

11
하나의 라이너 :string[0].toUpperCase() + string.substring(1)
dr.dimitru

@TarranJones 여기에 방탄 하나의 라이너가 있습니다 :(string[0] || '').toUpperCase() + string.substring(1)
dr.dimitru

@ dr.dimitru : 관용 대신에 (string[0] || '')당신은 할 수 있습니다 string.charAt(0).
Przemek


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

이 화살표 기능이 가장 쉽다는 것을 알았습니다. 바꾸기\w문자열 의 첫 문자 ( ) 와 일치하여 대문자로 변환합니다. 더 멋진 것은 필요하지 않습니다.


1
이것은 받아 들일만한 대답이어야합니다. 대신 SO가 오래된 질문을 계속 수상한 이후 거의 마지막입니다. Btw, 그것은 /./두 가지 이유를 사용 하는 것이 더 낫습니다 : /\w/이전의 문자가 아닌 문자를 모두 건너 뛰고 (@@ abc는 @@ Abc가됩니다) 그리고 라틴 문자가 아닌 문자와 작동하지 않습니다.
Cristian Traìna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.