web-dev-qa-db-fra.com

Quelle méthode peut être utilisée pour incrémenter des lettres?

Quelqu'un connaît-il une bibliothèque Javascript (par exemple, un trait de soulignement, jQuery, MooTools, etc.) offrant une méthode pour incrémenter une lettre?

J'aimerais pouvoir faire quelque chose comme:

"a"++; // would return "b"
78
andyzinsser
function nextChar(c) {
    return String.fromCharCode(c.charCodeAt(0) + 1);
}
nextChar('a');
134
Nathan Wall

Le javascript ordinaire devrait faire l'affaire:

String.fromCharCode('A'.charCodeAt() + 1) // Returns B
41
Zar

Et si la lettre donnée est z? Voici une meilleure solution. Cela va A, B, C ... X, Y, Z, AA, AB, ... etc. En gros, il incrémente les lettres comme l'identifiant de colonne d'un tableur Excel.

nextChar ('yz'); // retourne "ZA"

    function nextChar(c) {
        var u = c.toUpperCase();
        if (same(u,'Z')){
            var txt = '';
            var i = u.length;
            while (i--) {
                txt += 'A';
            }
            return (txt+'A');
        } else {
            var p = "";
            var q = "";
            if(u.length > 1){
                p = u.substring(0, u.length - 1);
                q = String.fromCharCode(p.slice(-1).charCodeAt(0));
            }
            var l = u.slice(-1).charCodeAt(0);
            var z = nextLetter(l);
            if(z==='A'){
                return p.slice(0,-1) + nextLetter(q.slice(-1).charCodeAt(0)) + z;
            } else {
                return p + z;
            }
        }
    }
    
    function nextLetter(l){
        if(l<90){
            return String.fromCharCode(l + 1);
        }
        else{
            return 'A';
        }
    }
    
    function same(str,char){
        var i = str.length;
        while (i--) {
            if (str[i]!==char){
                return false;
            }
        }
        return true;
    }

// below is simply for the html sample interface and is unrelated to the javascript solution

var btn = document.getElementById('btn');
var entry = document.getElementById('entry');
var node = document.createElement("div");
node.id = "node";

btn.addEventListener("click", function(){
  node.innerHTML = '';
  var textnode = document.createTextNode(nextChar(entry.value));
  node.appendChild(textnode);
  document.body.appendChild(node);
});
<input id="entry" type="text"></input>
<button id="btn">enter</button>

18
Ron Royston

Tu peux essayer ça 

console.log( 'a'.charCodeAt​(0))​

Convertissez-le d'abord en nombre Ascii .. Incrémentez-le .. puis convertissez d'Ascii en caractères ..

var nex = 'a'.charCodeAt(0);
console.log(nex)
$('#btn1').on('click', function() {
   var curr = String.fromCharCode(nex++)
   console.log(curr)
});

Vérifiez _ VIOLON

4
Sushanth --

J'avais besoin d'utiliser des séquences de lettres plusieurs fois et j'ai donc créé cette fonction en fonction de cette question SO. J'espère que cela peut aider les autres.

function charLoop(from, to, callback)
{
    var i = from.charCodeAt(0);
    var to = to.charCodeAt(0);
    for(;i<=to;i++) callback(String.fromCharCode(i));
}
  • de - lettre de début
  • à - dernière lettre
  • callback (letter) - la fonction à exécuter pour chaque lettre de la séquence

Comment l'utiliser:

charLoop("A", "K", function(char) {
    //char is one letter of the sequence
});

Voir cette démo de travail

3
letiagoalves

Un moyen possible pourrait être tel que défini ci-dessous

function incrementString(value) {
  let carry = 1;
  let res = '';

  for (let i = value.length - 1; i >= 0; i--) {
    let char = value.toUpperCase().charCodeAt(i);

    char += carry;

    if (char > 90) {
      char = 65;
      carry = 1;
    } else {
      carry = 0;
    }

    res = String.fromCharCode(char) + res;

    if (!carry) {
      res = value.substring(0, i) + res;
      break;
    }
  }

  if (carry) {
    res = 'A' + res;
  }

  return res;
}

console.info(incrementString('AAA')); // will print AAB
console.info(incrementString('AZA')); // will print AZB
console.info(incrementString('AZ')); // will print BA
console.info(incrementString('AZZ')); // will print BAA
console.info(incrementString('ABZZ')); // will print ACAA
console.info(incrementString('BA')); // will print BB
console.info(incrementString('BAB')); // will print BAC

// ... and so on ...

2
Sandeep Singh

Ajoutant à toutes ces réponses:

// first code on page
String.prototype.nextChar = function(i) {
    var n = i | 1;
    return String.fromCharCode(this.charCodeAt(0) + n);
}

String.prototype.prevChar = function(i) {
    var n = i | 1;
    return String.fromCharCode(this.charCodeAt(0) - n);
}

Exemple: http://jsfiddle.net/pitaj/3F5Qt/

2
PitaJ

Celui-ci fonctionne bien:

var nextLetter = letter => {
    let charCode = letter.charCodeAt(0);
    let isCapital = letter == letter.toUpperCase();

    if (isCapital == true) {
        return String.fromCharCode((charCode - 64) % 26 + 65)
    } else {
        return String.fromCharCode((charCode - 96) % 26 + 97)
    }
}

EXAMPLES

nextLetter("a"); // returns 'b'
nextLetter("z"); // returns 'a'
nextLetter("A"); // returns 'B'
nextLetter("Z"); // returns 'A'
1
NikK

Une solution juste pour rire

function nextLetter(str) {
  const Alphabet = [
    // lower case alphabet
    "a", "b", "c",
    "d", "e", "f",
    "g", "h", "i",
    "j", "k", "l",
    "m", "n", "o",
    "p", "q", "r",
    "s", "t", "u",
    "v", "w", "x",
    "y", "z",
    // upper case alphabet
    "A", "B", "C",
    "D", "E", "F",
    "G", "H", "I",
    "J", "K", "L",
    "M", "N", "O",
    "P", "Q", "R",
    "S", "T", "U",
    "V", "W", "X",
    "Y", "Z"
  ];

  const LetterArray = str.split("").map(letter => {
    if (Alphabet.includes(letter) === true) {
      return Alphabet[Alphabet.indexOf(letter) + 1];
    } else {
      return " ";
    }
  });

  const Assemble = () => LetterArray.join("").trim();
  return Assemble();
}


console.log(nextLetter("hello*3"));
1
dean schmid

Créez une fonction avec {a: 'b', b: 'c', etc} dans une fermeture: -

let nextChar = (s => (
    "abcdefghijklmopqrstuvwxyza".split('')
    .reduce((a,b)=> (s[a]=b, b)), // make the lookup
c=> s[c] // the function returned
))({}); // parameter s, starts empty

usage:-

nextChar('a')

Ajout de majuscules et de chiffres: -

let nextCh = (
    (alphabeta, s) => (
        [alphabeta, alphabeta.toUpperCase(), "01234567890"]
            .forEach(chars => chars.split('')
               .reduce((a,b) => (s[a]=b, b))), 
        c=> s[c] 
    )
)("abcdefghijklmopqrstuvwxyza", {});

p.s. Dans certaines versions de Javascript, vous pouvez utiliser [...chars] au lieu de chars.split('')

0
Quentin 2

C'est vraiment vieux. Mais j'avais besoin de cette fonctionnalité et aucune des solutions n'est optimale pour mon cas d'utilisation. Je voulais générer a, b, c ... z, aa, ab ... zz, aaa .... Cette récursion simple fait le travail. 

function nextChar(str) {
if (str.length == 0) {
    return 'a';
}
var charA = str.split('');
if (charA[charA.length - 1] === 'z') {
    return nextID(str.substring(0, charA.length - 1)) + 'a';
} else {
    return str.substring(0, charA.length - 1) +
        String.fromCharCode(charA[charA.length - 1].charCodeAt(0) + 1);
}
};
0
mrtyormaa

Voici une variante de l'algorithme rot13 que j'ai soumis le https://stackoverflow.com/a/28490254/881441 :

function rot1(s) {
  return s.replace(/[A-Z]/gi, c =>
    "BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza"[
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(c) ] )
}

Le code d’entrée dans la partie inférieure et le codec recherché sont situés dans la partie supérieure (c’est-à-dire que le code de sortie est identique au code d’entrée mais décalé de 1). La fonction ne change que les lettres, c’est-à-dire que si un autre caractère est passé, il ne sera pas modifié par ce codec.

0
Stephen Quan