Question Convertir la chaîne en casse de titre avec JavaScript


Existe-t-il un moyen simple de convertir une chaîne en cas de titre? Par exemple. john smith devient John Smith. Je ne cherche pas quelque chose de compliqué comme La solution de John Resig, juste (espérons-le) une sorte de doublure.


425
2017-10-13 08:05


origine


Réponses:


Essaye ça:

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

624
2017-10-13 08:18



Une manière un peu plus élégante, adaptant la fonction de Greg Dean:

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

Appelez ça comme:

"pascal".toProperCase();

174
2018-04-07 00:14



Essayez d'appliquer le texte-transformer Style CSS à vos contrôles.

par exemple: (text-transform: capitalize); 

N'utilisez une approche JS que lorsque cela est absolument nécessaire.


115
2018-06-16 14:58



Voici ma fonction qui convertit en casse mais conserve également les acronymes définis en majuscules et les mots mineurs en minuscules:

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

Par exemple:

"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:"

85
2018-06-25 01:04



Voici ma version, IMO c'est facile à comprendre et élégant aussi.

var str = "foo bar baz"

str.split(' ')
   .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())
   .join(' ')

// returns "Foo Bar Baz"

81
2018-03-05 09:07



Si le regex utilisé dans les solutions ci-dessus vous rend confus, essayez ce code:

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

16
2018-02-28 10:16



Je préfère ce qui suit aux autres réponses. Il correspond seulement à la première lettre de chaque mot et le capitalise. Code plus simple, plus facile à lire et moins d'octets.

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

16
2017-10-26 16:36



Sans utiliser regex juste pour référence:

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(' ');
};

'john smith'.toProperCase();

14
2017-12-19 16:25