Как сделать первую букву строки заглавной в JavaScript? - PullRequest
3412 голосов
/ 22 июня 2009

Как сделать первую букву строки заглавной, но не изменить регистр других букв?

Например:

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

Ответы [ 83 ]

6 голосов
/ 20 июля 2017

57 81 различных ответов на этот вопрос, некоторые не по теме, и все же ни один из них не поднимает важную проблему, заключающуюся в том, что ни одно из перечисленных решений не будет работать с азиатскими иероглифами, смайликами и другими высокими юникод- Точечные символы во многих браузерах. Вот решение, которое будет:

const consistantCapitalizeFirstLetter = "\uD852\uDF62".length === 1 ?
    function(S) {
        "use-strict"; // Hooray! The browser uses UTF32!
        return S.charAt(0).toUpperCase() + string.substring(1);
    } : function(S) {
        "use-strict";
        // the browser is using UCS16 to store UTF16
        var code = S.charCodeAt(0)|0;
        return (
          code >= 0xD800 && code <= 0xDBFF ? // detect surrogate pair
            S.slice(0,2).toUpperCase() + string.substring(2) :
            S.charAt(0).toUpperCase() + string.substring(1)
        );
    };
const prettyCapitalizeFirstLetter = "\uD852\uDF62".length === 1 ?
    function(S) {
        "use-strict"; // Hooray! The browser uses UTF32!
        return S.charAt(0).toLocaleUpperCase() + string.substring(1);
    } : function(S) {
        "use-strict";
        // the browser is using UCS16 to store UTF16
        var code = S.charCodeAt(0)|0;
        return (
          code >= 0xD800 && code <= 0xDBFF ? // detect surrogate pair
            S.slice(0,2).toLocaleUpperCase() + string.substring(2) :
            S.charAt(0).toLocaleUpperCase() + string.substring(1)
        );
    };

Обратите внимание, что вышеуказанное решение пытается учесть UTF32. Тем не менее, в спецификации официально говорится, что браузеры обязаны делать все в UTF16, сопоставленном с UCS2. Тем не менее, если мы все соберемся вместе, выполним свою часть и начнем готовиться к UTF32, то есть вероятность, что TC39 может позволить браузерам начать использовать UTF32 (например, как Python использует 24-битные символы для каждого символа строки). Для говорящего на английском это должно показаться глупым: никому, кто использует только латиницу-1, никогда не приходилось иметь дело с Мохибаке , потому что Latin-I поддерживается всеми кодировками символов. Но пользователям в других странах (таких как Китай, Япония, Индонезия и т. Д.) Не так повезло. Они постоянно борются с проблемами кодирования не только с веб-страницы, но и с Javascript: многие китайские / японские символы обрабатываются Javascript как две буквы и, следовательно, могут быть разбиты на части в середине, что приводит к и (два знака вопроса что не имеет смысла для конечного пользователя). Если бы мы могли начать готовиться к UTF32, то TC39 мог бы просто позволить браузерам делать то, что делал Python много лет назад, что сделало Python очень популярным для работы с символами высокого юникода: с использованием UTF32.

consistantCapitalizeFirstLetter работает правильно в IE3 + . prettyCapitalizeFirstLetter требует IE5.5 + (см. Верхнюю часть страницы 250 этого документа ). Однако это не просто шутки, потому что вполне вероятно, что остальная часть кода на вашей веб-странице не будет работать даже в IE8 - из-за всех ошибок DOM и JScript и отсутствия функций в этих старых браузерах. Кроме того, никто больше не использует IE3 или IE5.5.

6 голосов
/ 22 октября 2015

Понравилось:

function capitalize(string,a) {
    var tempstr = string.toLowerCase();
    if (a == false || a == undefined)
        return tempstr.replace(tempstr[0], tempstr[0].toUpperCase());
    else {
        return tempstr.split(" ").map(function (i) { return i[0].toUpperCase() + i.substring(1) }).join(" ");
    }
}


capitalize('stack overflow yeah!',true)); //Stack Overflow Yeah!

capitalize('stack stack stack stack overflow yeah!'));//Stack overflow yeah!

https://jsfiddle.net/dgmLgv7b/

6 голосов
/ 17 декабря 2015

Однострочник:

'string'.replace(/(^[a-z])/,function (p) { return p.toUpperCase(); } )
6 голосов
/ 30 августа 2016

Небольшое улучшение - каждое слово в заглавной букве.

String.prototype.toTitleCase = function(){
    return this.replace(/\b(\w+)/g, function(m,p){ return p[0].toUpperCase() + p.substr(1).toLowerCase() });
}

var s = 'heLLo wOrLD';
console.log(s.toTitleCase()); // Hello World
5 голосов
/ 04 июня 2018

Это просто

const upper = lower.replace(/^\w/, c => c.toUpperCase());
5 голосов
/ 06 мая 2016

Во-первых, просто хотелось прояснить, что означает использование заглавных букв в этом контексте. " T его S tring I s C apitalized" Надежный источник

Как видно из примера, это не то, что ищет ОП. То, что он должен сказать, это «Как мне сделать первую букву строки в верхнем регистре» ( Не заглавная строка )

function ucfirst (str) {
    return typeof str !="undefined"  ? (str += '', str[0].toUpperCase() + str.substr(1)) : '' ;
}

Объяснил

typeof str !="undefined" // is str set
? // true 
str += '' // turn the string variable into a string 
str[0].toUpperCase() //get the first character and make it upper case
+ // add
str.substr(1) // string starting from the index 1 ( starts at 0) 
: // false 
''; //return empty string

Это будет работать с любым аргументом или без аргумента вообще.

undefined         === ""
""                === ""
"my string"       === "My string"
null              === "Null"
undefined         === "";
false             === "False"
0                 === "0"
true              === "True"
[]                === ""
[true,0,"",false] === "True,0,,false"
5 голосов
/ 18 июля 2016

function capitalizeEachWord(str) {
    return str.replace(/\w\S*/g, function(txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    });
}

document.write(capitalizeEachWord('foo BAR God bAD'));
4 голосов
/ 19 декабря 2013

Я пытался сделать то же самое (то есть, заглавную первую букву в строке, пока она набирается), используя jQuery. Я искал ответ по всей сети, но не смог его найти. Однако мне удалось обойти использование on() функции в jQuery следующим образом:

$("#FirstNameField").on("keydown",function(e){
    var str = $("#FirstNameField").val();
    if(str.substring()===str.substring(0,1)){
        $("#FirstNameField").val(str.substring(0,1).toUpperCase());
    } 
});

Эта функция на самом деле использует заглавные буквы, когда вводимые данные вводятся непрерывно.

4 голосов
/ 28 марта 2016

Это делает то же самое действие:

var newStr = string.slice(0,1).toUpperCase() + string.slice(1);
4 голосов
/ 23 февраля 2019

Самое простое решение:

let yourSentence = 'it needs first letter upper case';

yourSentence.charAt(0).toUpperCase() + yourSentence.substr(1);

или

yourSentence.charAt(0).toUpperCase() + yourSentence.slice(1);

или

yourSentence.substr(0, 1).toUpperCase() + yourSentence.substr(1);
...