Dernièrement j'ai (re)découvert en Java cette écriture-ci:
1 2
|
String chaine = String.Format("Hello %s !", "World"); |
Qui donne comme résultat:
Je me suis dit: "Géééééniiiaaaal! On peut ajouter des paramètres à la chaine!!!".
Alors je me suis renseigné et j'ai remarqué que ce n'était rien de nouveau sous le soleil, étant donné que c'est la méthode String.Format. 
Un truc classique qui formate les valeurs passées en paramètres et qui tire son origine sans doute du printf du C.
Prout, j'étais fort déçu. 
Puis, j'ai cherché la version de String.Format en Javascript. Pas trouvée. 
Donc, je m'y suis mis. D'où m'a demande sur les RegExp à laquelle javatwister a aimablement répondu. Merci à lui, d'ailleurs. 
Bref, j'ai défini mes tags:
Chaine de caractères: %s, %sl, %su, %sx
Entier: %n, %nbase
Float: %f, %.chiffres, %f,chiffres
Date: %d('format')
Avec la regexp suivante:
var reg_exp_total = /%s\w?|%n\d*|%f[\.,]\d+|%d\('[^\)]+'\)/g;
C'est là que le code de javatwister m'intéressait beaucoup. Premièrement, on compte le nombres d'occurences:
var occurences = chaine.match(reg_exp_total).length;
Ensuite on boucle sur les occurences et on "retire" de la chaine la partie dont on vient de s'occuper:
1 2 3 4 5 6
|
chaine2 = chaine;
var reg_exp = /%s\w?|%n\d*|%f[\.,]\d+|%d\('[^\)]+'\)/;
var r = chaine2.match(reg_exp); // 1ère correspondance trouvée
var q += r.index+r[0].length; // incrémentation de "q";
chaine2 = chaine.substring(q);// on retranche les premiers caractères de chaine2, jusqu'à q; |
Pendant ce temps-là, j'ai fait un traitement sur la chaine selon le tag trouvé et le formatage voulu.
Y a plus qu'à remplacer le tag par le formatage:
1 2 3
|
chaine3 = chaine;
chaine3 = chaine3.replace(reg_exp, param); |
Petit à petit, chaine2 diminue et chaine3 grandit tandis que chaine reste la même afin de garder la position des tags.
Pour le formatage en lui-même, je fais un switch sur le tag trouvé et j'applique des méthodes fort connues comme:
1 2 3 4 5 6
|
toLowerCase();
toUpperCase();
parseInt();
parseFloat();
toFixed(); |
Puis je m'occupe des dates. Donc la date est décrite ainsi:
Nous sommes le %d('$dd/$mm/$yyyy').
J'utilise le même principe avec pour regexp ceci (elle est sûrement à retravailler):
1 2
|
var reg_exp_total = /\$dd\b|\$ddd|\$mm\b|\$mmm|\$yy\b|\$yyyy|\$hh|\$PM|\$mi\b|\$ss|\$milli/g; |
J'appelle la même méthode en lui précisant que je manipule une date (le paramètre à passer est un objet Date).
D'où certains if-else un peu partout afin d'obtenir une seule fonction pour les deux types de cas.
Ici, j'utilise les méthodes de l'objet Date:
1 2 3 4 5 6 7 8 9 10
|
getDate();
getDay();
getMonth();
getYear();
getFullYear();
getHours();
getMinutes();
getSeconds();
getMilliseconds(); |
Et le tour est joué.
Bien entendu, le script peut-être complété et amélioré. Il y a moyen de faire planter le programme ou d'obtenir des choses affreuses, mais le principe est là.
Je vous ai mis une page de test avec un exemple déjà lancé. Vous pouvez lancer vos propres exemples sauf si vous désirez manipuler les dates, vu qu'il faut un objet Date.
Edit: Ajout du code de SpaceFrog pour la page de test.
Partager