Hướng dẫn dùng caseconvert JavaScript

Asked 13 years, 11 months ago

Show

    Viewed 593k times

    Is there a simple way to convert a string to Title Case? E.g. john smith becomes John Smith. I'm not looking for something complicated like John Resig's solution, just (hopefully) some kind of one- or two-liner.

    Hướng dẫn dùng caseconvert JavaScript

    Penny Liu

    12.8k5 gold badges70 silver badges86 bronze badges

    asked Oct 13, 2008 at 8:05

    5

    Try this:

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

    Output:

    Hướng dẫn dùng caseconvert JavaScript

    meyi

    6,6451 gold badge14 silver badges27 bronze badges

    answered Oct 13, 2008 at 8:18

    Greg DeanGreg Dean

    28.4k14 gold badges66 silver badges76 bronze badges

    19

    If a CSS solution meets your needs, you can apply the text-transform CSS style to your controls:

    text-transform: capitalize;
    

    Just be aware that this will transform:
    hello world to Hello World
    HELLO WORLD to HELLO WORLD (no change)
    emily-jane o'brien to Emily-jane O'brien (incorrect)
    Maria von Trapp to Maria Von Trapp (incorrect)

    Michael

    7,5655 gold badges57 silver badges86 bronze badges

    answered Jun 16, 2010 at 14:58

    Hướng dẫn dùng caseconvert JavaScript

    Talha AshfaqueTalha Ashfaque

    3,2001 gold badge14 silver badges7 bronze badges

    13

    A slightly more elegant way, adapting Greg Dean's function:

    String.prototype.toProperCase = function () {
        return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
    };
    

    Call it like:

    "pascal".toProperCase();
    

    answered Apr 7, 2011 at 0:14

    TuanTuan

    5,2631 gold badge21 silver badges17 bronze badges

    8

    Here's my version, IMO it's easy to understand and elegant too.

    const str = "foo bar baz";
    const newStr = str.split(' ')
       .map(w => w[0].toUpperCase() + w.substring(1).toLowerCase())
       .join(' ');
    console.log(newStr);

    Hướng dẫn dùng caseconvert JavaScript

    xinthose

    2,6552 gold badges36 silver badges57 bronze badges

    answered Mar 5, 2014 at 9:07

    Hướng dẫn dùng caseconvert JavaScript

    a8ma8m

    9,1284 gold badges35 silver badges40 bronze badges

    9

    Here’s my function that converts to title case but also preserves defined acronyms as uppercase and minor words as lowercase:

    String.prototype.toTitleCase = function() {
      var i, j, str, lowers, uppers;
      str = this.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
      });
    
      // Certain minor words should be left lowercase unless 
      // they are the first or last words in the string
      lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
      'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
      for (i = 0, j = lowers.length; i < j; i++)
        str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
          function(txt) {
            return txt.toLowerCase();
          });
    
      // Certain words such as initialisms or acronyms should be left uppercase
      uppers = ['Id', 'Tv'];
      for (i = 0, j = uppers.length; i < j; i++)
        str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
          uppers[i].toUpperCase());
    
      return str;
    }
    

    For example:

    "TO LOGIN TO THIS SITE and watch tv, please enter a valid id:".toTitleCase();
    // Returns: "To Login to This Site and Watch TV, Please Enter a Valid ID:"
    

    answered Jun 25, 2011 at 1:04

    Hướng dẫn dùng caseconvert JavaScript

    Geoffrey BoothGeoffrey Booth

    6,9525 gold badges34 silver badges40 bronze badges

    10

    I prefer the following over the other answers. It matches only the first letter of each word and capitalises it. Simpler code, easier to read and less bytes. It preserves existing capital letters to prevent distorting acronyms. However you can always call toLowerCase() on your string first.

    function title(str) {
      return str.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
    }
    

    You can add this to your string prototype which will allow you to 'my string'.toTitle() as follows:

    String.prototype.toTitle = function() {
      return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
    }
    

    Example:

    answered Oct 26, 2017 at 16:36

    Tom KayTom Kay

    1,47215 silver badges25 bronze badges

    10

    You could immediately toLowerCase the string, and then just toUpperCase the first letter of each word. Becomes a very simple 1 liner:

    function titleCase(str) {
      return str.toLowerCase().replace(/\b\w/g, s => s.toUpperCase());
    }
    
    console.log(titleCase('iron man'));
    console.log(titleCase('iNcrEdible hulK'));

    answered Oct 18, 2016 at 15:09

    KevBotKevBot

    16.5k5 gold badges49 silver badges67 bronze badges

    6

    Benchmark

    TL;DR

    The winner of this benchmark is the plain old for loop:

    function titleize(str) {
        let upper = true
        let newStr = ""
        for (let i = 0, l = str.length; i < l; i++) {
            // Note that you can also check for all kinds of spaces  with
            // str[i].match(/\s/)
            if (str[i] == " ") {
                upper = true
                newStr += str[i]
                continue
            }
            newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase()
            upper = false
        }
        return newStr
    }
    // NOTE: you could beat that using charcode and string builder I guess.
    

    Details

    I've taken the most popular and distinct answers and made a benchmark with those.

    Here's the result on my MacBook pro:

    Hướng dẫn dùng caseconvert JavaScript

    And for completeness, here are the functions used:

    str = "the QUICK BrOWn Fox jUMPS oVeR the LAzy doG";
    function regex(str) {
      return str.replace(
        /\w\S*/g,
        function(txt) {
          return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
        }
      );
    }
    
    function split(str) {
      return str.
        split(' ').
        map(w => w[0].toUpperCase() + w.substr(1).toLowerCase()).
        join(' ');
    }
    
    function complete(str) {
      var i, j, str, lowers, uppers;
      str = str.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
      });
    
      // Certain minor words should be left lowercase unless 
      // they are the first or last words in the string
      lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
      'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
      for (i = 0, j = lowers.length; i < j; i++)
        str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
          function(txt) {
            return txt.toLowerCase();
          });
    
      // Certain words such as initialisms or acronyms should be left uppercase
      uppers = ['Id', 'Tv'];
      for (i = 0, j = uppers.length; i < j; i++)
        str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
          uppers[i].toUpperCase());
    
      return str;
    }
    
    function firstLetterOnly(str) {
      return str.replace(/\b(\S)/g, function(t) { return t.toUpperCase(); });
    }
    
    function forLoop(str) {
      let upper = true;
      let newStr = "";
      for (let i = 0, l = str.length; i < l; i++) {
        if (str[i] == " ") {
          upper = true;
            newStr += " ";
          continue;
        }
        newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase();
        upper = false;
      }
      return newStr;
    }
    

    Note that i deliberately did not change the prototype since I consider it a really bad practice and I don't think we should promote such practice in our answers. This is only ok for small codebases when you're the only one working on it.

    If you want to add any other way to do it to this benchmark, please comment a link to the answer !


    EDIT 2022 Mac M1: On my new computer, with more recent chrome, split wins. If you really care about performance on a specific machine you should run the benchmark yourself

    answered Nov 19, 2020 at 10:56

    Hướng dẫn dùng caseconvert JavaScript

    Ulysse BNUlysse BN

    8,8917 gold badges48 silver badges76 bronze badges

    4

    var result =
      'this is very interesting'.replace(/\b[a-z]/g, (x) => x.toUpperCase())
    
    console.log(result) // This Is Very Interesting

    answered Dec 24, 2013 at 15:17

    Hướng dẫn dùng caseconvert JavaScript

    simosimo

    14.5k7 gold badges43 silver badges58 bronze badges

    5

    Surprised to see no one mentioned the use of rest parameter. Here is a simple one liner that uses ES6 Rest parameters.

    let str="john smith"
    str=str.split(" ").map(([firstChar,...rest])=>firstChar.toUpperCase()+rest.join("").toLowerCase()).join(" ")
    console.log(str)

    answered May 18, 2020 at 16:53

    Hướng dẫn dùng caseconvert JavaScript

    kapil pandeykapil pandey

    1,7331 gold badge12 silver badges25 bronze badges

    0

    Without using regex just for reference:

    String.prototype.toProperCase = function() {
      var words = this.split(' ');
      var results = [];
      for (var i = 0; i < words.length; i++) {
        var letter = words[i].charAt(0).toUpperCase();
        results.push(letter + words[i].slice(1));
      }
      return results.join(' ');
    };
    
    console.log(
      'john smith'.toProperCase()
    )

    adiga

    32.2k8 gold badges55 silver badges78 bronze badges

    answered Dec 19, 2011 at 16:25

    Hướng dẫn dùng caseconvert JavaScript

    MikeMike

    4173 silver badges6 bronze badges

    1

    Just in case you are worried about those filler words, you can always just tell the function what not to capitalize.

    /**
     * @param String str The text to be converted to titleCase.
     * @param Array glue the words to leave in lowercase. 
     */
    var titleCase = function(str, glue){
        glue = (glue) ? glue : ['of', 'for', 'and'];
        return str.replace(/(\w)(\w*)/g, function(_, i, r){
            var j = i.toUpperCase() + (r != null ? r : "");
            return (glue.indexOf(j.toLowerCase())<0)?j:j.toLowerCase();
        });
    };
    

    Hope this helps you out.

    edit

    If you want to handle leading glue words, you can keep track of this w/ one more variable:

    var titleCase = function(str, glue){
        glue = !!glue ? glue : ['of', 'for', 'and', 'a'];
        var first = true;
        return str.replace(/(\w)(\w*)/g, function(_, i, r) {
            var j = i.toUpperCase() + (r != null ? r : '').toLowerCase();
            var result = ((glue.indexOf(j.toLowerCase()) < 0) || first) ? j : j.toLowerCase();
            first = false;
            return result;
        });
    };
    

    answered Nov 13, 2010 at 5:17

    fncompfncomp

    5,9103 gold badges32 silver badges42 bronze badges

    6

    If you need a grammatically correct answer:

    This answer takes into account prepositions such as "of", "from", .. The output will generate an editorial style title you would expect to see in a paper.

    toTitleCase Function

    The function that takes into account grammar rules listed here. The function also consolidates whitespace and removes special characters (modify regex for your needs)

    const toTitleCase = (str) => {
      const articles = ['a', 'an', 'the'];
      const conjunctions = ['for', 'and', 'nor', 'but', 'or', 'yet', 'so'];
      const prepositions = [
        'with', 'at', 'from', 'into','upon', 'of', 'to', 'in', 'for',
        'on', 'by', 'like', 'over', 'plus', 'but', 'up', 'down', 'off', 'near'
      ];
    
      // The list of spacial characters can be tweaked here
      const replaceCharsWithSpace = (str) => str.replace(/[^0-9a-z&/\\]/gi, ' ').replace(/(\s\s+)/gi, ' ');
      const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase() + str.substr(1);
      const normalizeStr = (str) => str.toLowerCase().trim();
      const shouldCapitalize = (word, fullWordList, posWithinStr) => {
        if ((posWithinStr == 0) || (posWithinStr == fullWordList.length - 1)) {
          return true;
        }
    
        return !(articles.includes(word) || conjunctions.includes(word) || prepositions.includes(word));
      }
    
      str = replaceCharsWithSpace(str);
      str = normalizeStr(str);
    
      let words = str.split(' ');
      if (words.length <= 2) { // Strings less than 3 words long should always have first words capitalized
        words = words.map(w => capitalizeFirstLetter(w));
      }
      else {
        for (let i = 0; i < words.length; i++) {
          words[i] = (shouldCapitalize(words[i], words, i) ? capitalizeFirstLetter(words[i], words, i) : words[i]);
        }
      }
    
      return words.join(' ');
    }
    

    Unit Tests to Ensure Correctness

    import { expect } from 'chai';
    import { toTitleCase } from '../../src/lib/stringHelper';
    
    describe('toTitleCase', () => {
      it('Capitalizes first letter of each word irrespective of articles, conjunctions or prepositions if string is no greater than two words long', function(){
        expect(toTitleCase('the dog')).to.equal('The Dog'); // Capitalize articles when only two words long
        expect(toTitleCase('for all')).to.equal('For All'); // Capitalize conjunctions when only two words long
        expect(toTitleCase('with cats')).to.equal('With Cats'); // Capitalize prepositions when only two words long
      });
    
      it('Always capitalize first and last words in a string irrespective of articles, conjunctions or prepositions', function(){
        expect(toTitleCase('the beautiful dog')).to.equal('The Beautiful Dog');
        expect(toTitleCase('for all the deadly ninjas, be it so')).to.equal('For All the Deadly Ninjas Be It So');
        expect(toTitleCase('with cats and dogs we are near')).to.equal('With Cats and Dogs We Are Near');
      });
    
      it('Replace special characters with space', function(){
        expect(toTitleCase('[wolves & lions]: be careful')).to.equal('Wolves & Lions Be Careful');
        expect(toTitleCase('wolves & lions, be careful')).to.equal('Wolves & Lions Be Careful');
      });
    
      it('Trim whitespace at beginning and end', function(){
        expect(toTitleCase(' mario & Luigi superstar saga ')).to.equal('Mario & Luigi Superstar Saga');
      });
    
      it('articles, conjunctions and prepositions should not be capitalized in strings of 3+ words', function(){
        expect(toTitleCase('The wolf and the lion: a tale of two like animals')).to.equal('The Wolf and the Lion a Tale of Two like Animals');
        expect(toTitleCase('the  three Musketeers  And plus ')).to.equal('The Three Musketeers and Plus');
      });
    });
    

    Please note that I am removing quite a bit of special characters from the strings provided. You will need to tweak the regex to address the requirements of your project.

    answered Oct 16, 2017 at 16:17

    Hướng dẫn dùng caseconvert JavaScript

    dipole_momentdipole_moment

    4,5262 gold badges38 silver badges55 bronze badges

    4

    If regex used in the above solutions is getting you confused, try this code:

    function titleCase(str) {
      return str.split(' ').map(function(val){ 
        return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase();
      }).join(' ');
    }
    

    answered Feb 28, 2016 at 10:16

    Hướng dẫn dùng caseconvert JavaScript

    6

    I made this function which can handle last names (so it's not title case) such as "McDonald" or "MacDonald" or "O'Toole" or "D'Orazio". It doesn't however handle German or Dutch names with "van" or "von" which are often in lower-case... I believe "de" is often lower-case too such as "Robert de Niro". These would still have to be addressed.

    function toProperCase(s)
    {
      return s.toLowerCase().replace( /\b((m)(a?c))?(\w)/g,
              function($1, $2, $3, $4, $5) { if($2){return $3.toUpperCase()+$4+$5.toUpperCase();} return $1.toUpperCase(); });
    }
    

    answered Feb 3, 2010 at 22:22

    LwangamanLwangaman

    1291 silver badge2 bronze badges

    3

    If you can use third party libraries in your code then lodash has a helper function for us.

    https://lodash.com/docs/4.17.3#startCase

    _.startCase('foo bar');
    // => 'Foo Bar'
    
    _.startCase('--foo-bar--');
    // => 'Foo Bar'
     
    _.startCase('fooBar');
    // => 'Foo Bar'
     
    _.startCase('__FOO_BAR__');
    // => 'FOO BAR'

    answered Dec 29, 2016 at 11:27

    waqaswaqas

    4,2473 gold badges33 silver badges42 bronze badges

    ES 6

    str.split(' ')
       .map(s => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())
       .join(' ')
    

    else

    str.split(' ').map(function (s) {
        return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase();
    }).join(' ')
    

    Hướng dẫn dùng caseconvert JavaScript

    Steve Bennett

    103k29 gold badges149 silver badges203 bronze badges

    answered Oct 27, 2016 at 15:52

    jssridharjssridhar

    4604 silver badges10 bronze badges

    5

    First, convert your string into array by splitting it by spaces:

    var words = str.split(' ');
    

    Then use array.map to create a new array containing the capitalized words.

    var capitalized = words.map(function(word) {
        return word.charAt(0).toUpperCase() + word.substring(1, word.length);
    });
    

    Then join the new array with spaces:

    capitalized.join(" ");
    

    NOTE:

    This of course has a drawback. This will only capitalize the first letter of every word. By word, this means that it treats every string separated by spaces as 1 word.

    Supposedly you have:

    str = "I'm a little/small tea pot";

    This will produce

    I'm A Little/small Tea Pot

    compared to the expected

    I'm A Little/Small Tea Pot

    In that case, using Regex and .replace will do the trick:

    with ES6:

    const capitalize = str => str.length
      ? str[0].toUpperCase() +
        str.slice(1).toLowerCase()
      : '';
    
    const escape = str => str.replace(/./g, c => `\\${c}`);
    const titleCase = (sentence, seps = ' _-/') => {
      let wordPattern = new RegExp(`[^${escape(seps)}]+`, 'g');
      
      return sentence.replace(wordPattern, capitalize);
    };
    console.log( titleCase("I'm a little/small tea pot.") );

    or without ES6:

    function capitalize(str) {
      return str.charAt(0).toUpperCase() + str.substring(1, str.length).toLowerCase();
    }
    
    function titleCase(str) {
      return str.replace(/[^\ \/\-\_]+/g, capitalize);
    }
    
    console.log(titleCase("I'm a little/small tea pot."));

    answered Sep 30, 2017 at 9:28

    Hướng dẫn dùng caseconvert JavaScript

    xGeoxGeo

    2,1192 gold badges16 silver badges39 bronze badges

    Most of these answers seem to ignore the possibility of using the word boundary metacharacter (\b). A shorter version of Greg Dean's answer utilizing it:

    function toTitleCase(str)
    {
        return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); });
    }
    

    Works for hyphenated names like Jim-Bob too.

    answered Jul 16, 2014 at 14:59

    lewax00lewax00

    1881 silver badge8 bronze badges

    3

    var toMatch = "john w. smith";
    var result = toMatch.replace(/(\w)(\w*)/g, function (_, i, r) {
          return i.toUpperCase() + (r != null ? r : "");
        }
    )
    

    Seems to work... Tested with the above, "the quick-brown, fox? /jumps/ ^over^ the ¡lazy! dog..." and "C:/program files/some vendor/their 2nd application/a file1.txt".

    If you want 2Nd instead of 2nd, you can change to /([a-z])(\w*)/g.

    The first form can be simplified as:

    function toTitleCase(toTransform) {
      return toTransform.replace(/\b([a-z])/g, function (_, initial) {
          return initial.toUpperCase();
      });
    }
    

    answered Oct 13, 2008 at 8:17

    PhiLhoPhiLho

    39.8k6 gold badges93 silver badges131 bronze badges

    Try this, shortest way:

    str.replace(/(^[a-z])|(\s+[a-z])/g, txt => txt.toUpperCase());
    

    Mr. Polywhirl

    36.4k12 gold badges76 silver badges124 bronze badges

    answered Jun 6, 2017 at 9:52

    VikramVikram

    5545 silver badges16 bronze badges

    1

    Try this

    String.prototype.toProperCase = function(){
        return this.toLowerCase().replace(/(^[a-z]| [a-z]|-[a-z])/g, 
            function($1){
                return $1.toUpperCase();
            }
        );
    };
    

    Example

    var str = 'john smith';
    str.toProperCase();
    

    answered May 16, 2012 at 19:05

    Maxi BaezMaxi Baez

    5805 silver badges13 bronze badges

    0

    Use /\S+/g to support diacritics:

    function toTitleCase(str) {
      return str.replace(/\S+/g, str => str.charAt(0).toUpperCase() + str.substr(1).toLowerCase());
    }
    
    console.log(toTitleCase("a city named örebro")); // A City Named Örebro

    However: "sunshine (yellow)" ⇒ "Sunshine (yellow)"

    answered Jun 20, 2016 at 20:31

    Hướng dẫn dùng caseconvert JavaScript

    le_mle_m

    18.3k9 gold badges61 silver badges74 bronze badges

    I think the simplest is using css.

    function format_str(str) {
        str = str.toLowerCase();
        return ''+ str +'';
    }
    

    answered Jul 7, 2017 at 5:01

    wondimwondim

    67913 silver badges27 bronze badges

    3

    "john f. kennedy".replace(/\b\S/g, t => t.toUpperCase())
    

    answered Jun 21, 2019 at 8:30

    ProximoProximo

    5,76710 gold badges46 silver badges64 bronze badges

    3

    Here's a really simple & concise ES6 function to do this:

    const titleCase = (str) => {
      return str.replace(/\w\S*/g, (t) => { return t.charAt(0).toUpperCase() + t.substr(1).toLowerCase() });
    }
    
    export default titleCase;
    

    Works well included in a utilities folder and used as follows:

    import titleCase from './utilities/titleCase.js';
    
    const string = 'my title & string';
    
    console.log(titleCase(string)); //-> 'My Title & String'
    

    answered Nov 19, 2020 at 10:39

    Hedley SmithHedley Smith

    1,23115 silver badges12 bronze badges

    1

    Here is my function that is taking care of accented characters (important for french !) and that can switch on/off the handling of lowers exceptions. Hope that helps.

    String.prototype.titlecase = function(lang, withLowers = false) {
        var i, string, lowers, uppers;
    
        string = this.replace(/([^\s:\-'])([^\s:\-']*)/g, function(txt) {
            return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
        }).replace(/Mc(.)/g, function(match, next) {
            return 'Mc' + next.toUpperCase();
        });
    
        if (withLowers) {
            if (lang == 'EN') {
                lowers = ['A', 'An', 'The', 'At', 'By', 'For', 'In', 'Of', 'On', 'To', 'Up', 'And', 'As', 'But', 'Or', 'Nor', 'Not'];
            }
            else {
                lowers = ['Un', 'Une', 'Le', 'La', 'Les', 'Du', 'De', 'Des', 'À', 'Au', 'Aux', 'Par', 'Pour', 'Dans', 'Sur', 'Et', 'Comme', 'Mais', 'Ou', 'Où', 'Ne', 'Ni', 'Pas'];
            }
            for (i = 0; i < lowers.length; i++) {
                string = string.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), function(txt) {
                    return txt.toLowerCase();
                });
            }
        }
    
        uppers = ['Id', 'R&d'];
        for (i = 0; i < uppers.length; i++) {
            string = string.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), uppers[i].toUpperCase());
        }
    
        return string;
    }
    

    answered Dec 11, 2016 at 16:36

    Hướng dẫn dùng caseconvert JavaScript

    OuatatazOuatataz

    1552 silver badges11 bronze badges

    here's another solution using css (and javascript, if the text you want to transform is in uppercase):

    html

    JOHN SMITH
    

    js

    var str = document.getElementById('text').innerHtml;
    var return_text = str.toLowerCase();
    

    css

    #text{text-transform:capitalize;}
    

    answered Oct 25, 2018 at 12:12

    henriehenrie

    1471 silver badge12 bronze badges

    Taking the "lewax00" solution I created this simple solution that force to "w" starting with space or "w" that initiate de word, but is not able to remove the extra intermediate spaces.

    "SOFÍA vergara".toLowerCase().replace(/\b(\s\w|^\w)/g, function (txt) { return txt.toUpperCase(); });

    The result is "Sofía Vergara".

    answered Sep 30, 2014 at 18:52

    Hướng dẫn dùng caseconvert JavaScript

    AserewareAsereware

    9896 silver badges7 bronze badges

    We have been having a discussion back here at the office and we think that trying to automatically correct the way people input names in the current way you want it doing is fraught with possible issues.

    We have come up with several cases where different types of auto capitalization fall apart and these are just for English names alone, each language has its own complexities.

    Issues with capitalizing the first letter of each name:

    • Acronyms such as IBM aren’t allowed to be inputted, would turn into Ibm.

    • The Name McDonald would turn into Mcdonald which is incorrect, the same thing is MacDonald too.

    • Double barrelled names such as Marie-Tonks would get turned into Marie-tonks.

    • Names like O’Connor would turn into O’connor.

    For most of these you could write custom rules to deal with it, however, this still has issues with Acronyms as before and you get a new issue:

    • Adding in a rule to fix names with Mac such as MacDonald, would the break names such as Macy turning it into MacY.

    The only solution we have come up with that is never incorrect is to capitalize every letter which is a brute force method that the DBS appear to also use.

    So if you want to automate the process it is as good as impossible to do without a dictionary of every single name and word and how it should be capitlized, If you don't have a rule that covers everything don't use it as it will just annoy your users and prompt people who want to enter their names correctly to go else where.

    answered Jul 18, 2017 at 13:13

    jjr2000jjr2000

    4977 silver badges17 bronze badges

    1