2
votes

Insérer dans le tableau à chaque nième position

Ce que j'essaie de réaliser, c'est de créer un nombre formaté avec un séparateur de milliers à partir d'une simple entrée de chaîne. Ainsi, mon entrée ressemblerait à quelque chose comme let input = "12345" et ma valeur de retour attendue devrait ressembler à "12,345" .

Je sais qu'il existe déjà plusieurs bibliothèques, qui s'occupent de cela, mais je veux rester simple et le faire moi-même. Ma solution actuelle est un peu redondante (à cause du double .reverse () ) et je suis presque sûr qu'il existe une meilleure solution.

let array = input.split('');

array.reverse();

for (let i = 3; i < array.length; i += 4) {
    array.splice(i, 0, ',');
}

array.reverse();

return array.join('');


5 Réponses :


1
votes

Vous pouvez remplacer en recherchant un groupe de trois caractères à la fin de la chaîne.

var string = '12345678';

console.log(string.replace(/(?=(...)+$)/g, ','));


0 commentaires

0
votes

Voici une solution simple, mais l'expression régulière est meilleure.

function separate(str, separator) {
  // Handling the head case (from 0 to 2 size)
  const headSize = str.length % 3;
  
  let newFormat = headSize ? `${str.substr(0, headSize)}${separator}` : '';
  
  // Handle every 3 character
  const nbTripleChar = (str.length - headSize) / 3;

  for (let i = 0; i < nbTripleChar; i += 1) {
     newFormat = `${newFormat}${str.substr((i * 3) + headSize, 3)}`;
     
     if ((i + 1) !== nbTripleChar) {
       newFormat = `${newFormat}${separator}`;
     }
  }
  
  return newFormat;
}

console.log(separate('12515', ','));


0 commentaires

2
votes

J'ai fait une réponse similaire pour une autre question: Insérez un nouvel élément après chaque élément du tableau nt-h . C'est une méthode généralisée qui insère un jeton toutes les N positions. La solution utilise une boucle while avec le Array.splice () . Pour répondre à votre demande, je l'ai étendu pour prendre en charge le démarrage des inserts à partir de la fin du tableau. Juste une autre option ...

.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
let input = "1234567890";
console.log(Number(input).toLocaleString("en-US"));

Mais, évidemment, comme les gens l'ont commenté, votre meilleure option pour cela sera d'utiliser input.toLocaleString('en-US'):

p>

.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
let insertTokenEveryN = (arr, token, n, fromEnd) => {

    // Clone the received array, so we don't mutate the
    // original one. You can ignore this if you don't mind.

    let a = arr.slice(0);
    
    // Insert the <token> every <n> elements.

    let idx = fromEnd ? a.length - n : n;

    while ((fromEnd ? idx >= 1 : idx <= a.length))
    {
        a.splice(idx, 0, token);
        idx = (fromEnd  ? idx - n : idx + n + 1);
    }

    return a;
};

let array = Array.from("1234567890");
let res1 = insertTokenEveryN(array, ",", 3, true);
console.log(res1.join(""));


0 commentaires


0
votes

Si vous n'êtes pas fan de Regex. ou des fonctions intégrées comme toLocaleString (), cela devrait gérer la plupart des cas que vous pourriez rencontrer

function format(str) {
  str = str.trim().replace(/\s+/g, '')
  if (isNaN(str)) return 'NaN'
  str = str.split('')
  let strBuild = [str.pop()]
  for (let number of strBuild) {
    if (strBuild.length % 3 === 0) strBuild.unshift(str.pop() + ',')
    else strBuild.unshift(str.pop())
    if (!str.length) return strBuild.join('');
  }
}
console.log(format('1 '))
console.log(format('1 a 2'))
console.log(format(' 12 '))
console.log(format('123 '))
console.log(format(' 123'))
console.log(format(' 1 2 3'))
console.log(format('1 2 3 '))
console.log(format('12 34'))
console.log(format('123   45678'))
console.log(format('12349  567  8'))
console.log(format('  1234 9567   81   '))
console.log(format('  1234 9567   81 9 7 5 6 4 5 8 '))
console.log(format('  1234 9567   81 c  '))


0 commentaires