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 :
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, ','));
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', ','));
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(""));
Vous pouvez parcourir le tableau en arrière et construire la chaîne en utilisant un deuxième index.
La concaténation de chaînes peut être coûteuse mais elle n'itère qu'une seule fois la liste. Vous pourriez aussi probablement nous .reduce () pour faire cela sans boucle for (puisque presque toutes les opérations d'itération de tableau peuvent être effectuées comme un appel de fonction de nos jours); let input = 123456789949949291;
let array = input.toString().split('');
let candidateString = '';
for (let i = array.length-1; i >=0; i--) {
candidateString=array[i]+candidateString;
let revIndex=array.length-i;
if(revIndex%3==0 && revIndex!== array.length){
candidateString = ','+candidateString;
}
}
console.log(candidateString);
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 '))
Pas besoin de bibliothèque ou de solution maison. Chaque navigateur actuel prend en charge
Number.prototype .toLocaleString.Si vous voulez rouler le vôtre de manière concise, au détriment de la lisibilité pour certains ... stackoverflow.com/a/2901298/294949 a>
Number ("12345"). ToLocaleString ();
Si vous voulez quand même rouler vous-même, vous pouvez décrémenter le tableau d'origine, au lieu d'incrémenter un tableau inversé.
input.toLocaleString ('en-US'). Spécifiez leen-USpour un séparateur de 1000. La représentation numérique dansen-IN, par exemple, est différentegrâce à @str et @ ana-liza-pandac, vos suggestions de solutions étaient exactement ce que je recherchais! Mais par pure curiosité, j'aimerais savoir s'il y aurait une solution pour y parvenir sur un tableau (par exemple avec
.mapou.reduce). Criez également à @mortz pour l'indication avec le paramètre!Oui, vous pouvez utiliser
.mapavectoLocaleString.(par exemple avec .map ou .reduce).Vous pourriez faire ->input.split (""). map ((m, i) => (a.length - i)% 3 === 0 && (i> 0)? "," + M: m) .join ("")