Maison > Article > interface Web > Implémentation des fonctions sprintf et printf dans les compétences JavaScript_javascript
Implémentez les fonctions sprintf/printf que l'on trouve dans la plupart des langagessous JavaScript.
http://www.webtoolkit.info/javascript-sprintf.html : Une simulation relativement complète de la fonction sprintf. Caractères génériques de formatage disponibles :
1.%% - Renvoie le signe de pourcentage lui-même
2.%b - Nombre binaire
3.%c - Caractère correspondant ASCII
4.%d - entier
5.%f - nombre à virgule flottante
6.%o - Nombre octal
7.%s - chaîne
8.%x - nombre hexadécimal (forme de lettre minuscule)
9.%X - nombre hexadécimal (forme de lettre majuscule)
Les options disponibles entre les signes % et les caractères génériques incluent (par exemple %.2f) :
1. (Forcer l'affichage du signe et - devant le nombre comme signe des nombres positifs et négatifs. Par défaut, seuls les nombres négatifs affichent le signe -)
2.- (variables alignées à gauche)
3.0 (utilisez 0 comme caractère de remplissage aligné à droite)
4.[0-9] (Définir la largeur minimale de la variable)
5..[0-9] (Définir la précision en virgule flottante ou la longueur de la chaîne)
sprintfWrapper = {
init : fonction () {
if (typeof arguments == "undefined") { return null; >
if (arguments.length < 1) { return null; >
if (typeof arguments[0] != "string") { return null; >
if (typeof RegExp == "undefined") { return null ; >
var string = arguments[0];
var exp = new RegExp(/(%([%]|(-)?( |x20)?(0)?(d )?(.(d)?)?([bcdfosxX])))/g);
var correspond = new Array();
var chaînes = new Array();
var convCount = 0;
var stringPosStart = 0;
var stringPosEnd = 0;
var matchPosEnd = 0;
var nouvelleChaîne = '';
var match = null;
while (match = exp.exec(string)) {
if (match[9]) { convCount = 1 ; >
stringPosStart = matchPosEnd;
stringPosEnd = exp.lastIndex - match[0].length;
strings[strings.length] = string.substring(stringPosStart, stringPosEnd);
matchPosEnd = exp.lastIndex;
matches[matches.length] = {
correspondance : match[0],
à gauche : match[3] ? vrai : faux,
signe : match[4] || '',
pad : match[5] || ' ',
min : match[6] || 0,
précision : match[8],
code : match[9] || '%',
négatif : parseInt(arguments[convCount]) < 0 ? vrai : faux,
argument : String(arguments[convCount])
};
>
strings[strings.length] = string.substring(matchPosEnd);
if (matches.length == 0) { chaîne de retour ; >
if ((arguments.length - 1) < convCount) { return null; >
var code = null;
var match = null;
var je = nul;
pour (i=0; i if (matches[i].code == '%') { substitution = '%' } newString = chaînes[i]; } return newString; }, convertir : fonction(match, nosign){ sprintf = sprintfWrapper.init;
sinon if (matches[i].code == 'b') {
matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(2));
substitution = sprintfWrapper.convert(matches[i], true);
>
sinon if (matches[i].code == 'c') {
matches[i].argument = String(String.fromCharCode(parseInt(Math.abs(parseInt(matches[i].argument)))));
substitution = sprintfWrapper.convert(matches[i], true);
>
sinon if (matches[i].code == 'd') {
matches[i].argument = String(Math.abs(parseInt(matches[i].argument)));
substitution = sprintfWrapper.convert(matches[i]);
>
sinon if (matches[i].code == 'f') {
matches[i].argument = String(Math.abs(parseFloat(matches[i].argument)).toFixed(matches[i].precision ? matches[i].precision : 6));
substitution = sprintfWrapper.convert(matches[i]);
>
sinon if (matches[i].code == 'o') {
matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(8));
substitution = sprintfWrapper.convert(matches[i]);
>
sinon if (matches[i].code == 's') {
matches[i].argument = matches[i].argument.substring(0, matches[i].precision ? matches[i].precision : matches[i].argument.length)
substitution = sprintfWrapper.convert(matches[i], true);
>
sinon if (matches[i].code == 'x') {
matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
substitution = sprintfWrapper.convert(matches[i]);
>
sinon if (matches[i].code == 'X') {
matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
substitution = sprintfWrapper.convert(matches[i]).toUpperCase();
>
sinon {
substitution = matches[i].match;
>
newString = substitution;
newString = chaînes[i];
si (pas de signe) {
match.sign = '';
} autre {
match.sign = match.negative ? '-' : match.sign;
>
var l = match.min - match.argument.length 1 - match.sign.length;
var pad = new Array(l < 0 ? 0 : l).join(match.pad);
si (!match.left) {
if (match.pad == "0" || nosign) {
return match.sign pad match.argument;
} autre {
return pad match.sign match.argument;
>
} autre {
if (match.pad == "0" || nosign) {
return match.sign match.argument pad.replace(/0/g, ' ');
} autre {
return match.sign match.argument pad;
>
>
>
>
Si vous souhaitez simplement remplacer le contenu de la variable de position sans formatage supplémentaire, vous pouvez utiliser le printf fourni dans les outils YUI relativement simples :
Lorsqu'il est utilisé comme YAHOO.Tools.printf("Display string {0}, {1}.", "1", "2"); utilisez {?} pour faire correspondre.