Encore un casse tete en Javascript . Formater un nombre ou un texte en rajoutant un bourrage pour les nombre en rajoutant des z곯s au dꣵt bien sure ou pour les textes ajouter tout autre caract鳥s
voici une fonction qui permet de formater (de bourrer ) un nombre ou un texte :
function padNumberOrString(toFormat , formatLength , pad) {
var n=toFormat ;
var formated="";
//convertir en entier la longueur du format sinon prendre 0
var ln=formatLength/1||0;
//calculer le bourrage
var padding=new Array(ln).join(pad||"0");
if( ! isNaN( n/1) ){
// pour les nombre
//extraire la partie decimale entiere et la formater
formated= n.toString().replace(/([-]?)([0-9]*)(\.?[0-9]*)/,
function(c, p1, p2, p3 ){
var l=ln - p2.length;
if(l>0){
p2=(padding.slice(0, l) + p2);
}
return [p1, p2, p3].join('');
});
}else{
//sinon c est du texte
formated= (padding.slice(0, ln - n.length) + n);
}
return formated;
}
Cette fonction peut etre appelee comme suit :
padNumberOrString(-1.23,4) //: Obtient -0001.23
padNumberOrString("-1.23",4) //: Obtient -0001.23
padNumberOrString(10,2) //: Obtient 10
padNumberOrString(10,1) //: Obtient 10
padNumberOrString(10,4,"#") //: Obtient ##10
padNumberOrString("Texte",8,"#") //: Obtient ###Texte
Et en voici une version plus compacte de la fonction qui ne prends pas en charge
la partie des decimale s il y a biensure cela dependra du besoin
function padNumberOrString(toPad, formatLength,pad) {
var minus = '';
var pad=pad||'0';
if (toPad < 0) {
minus = '-';
toPad = -toPad;
}
toPad = '' + toPad;
while(toPad.length < formatLength) toPad = pad + toPad;
return minus + num;
}
padNumberOrString(-1.23,4) //: Obtient -1.23 la longueur totale
padNumberOrString("-1.23",4) //: Obtient -1.23 idem ne tient pas compte de la partie decimale
padNumberOrString("-1.23",5) //: Obtient -01.23
padNumberOrString(10,2) //: Obtient 10
padNumberOrString(10,1) //: Obtient 10
padNumberOrString(10,4,"#") //: Obtient ##10
padNumberOrString("Texte",8,"#") //: Obtient ###Texte
On voit que la methode precedente a bien ces limites :
-Ne tient pas compte de la partie decimale
On peut presenter un autre algorithme pour cette fonction voir comme ceci :
function padNumberOrString(toPad,formatLength){
var minus=toPad<0?"-":"";
toPad=toPad/1?Math.abs(toPad)+"": toPad;
formatLength=formatLength/1||toPad.length;
return minus + new Array(Math.max(formatLength ,toPad.length)-toPad.length+1).join("0")+toPad
}
Voici quelques tests
padNumberOrString(-1.23,4) //: Obtient -1.23 la longueur totale
padNumberOrString("-1.23",4) //: Obtient -1.23 idem ne tient pas compte de la partie decimale
padNumberOrString("-1.23",5) //: Obtient -01.23
padNumberOrString(10,2) //: Obtient 10
padNumberOrString(10,1) //: Obtient 10
padNumberOrString(10,4,"#") //: Obtient ##10
padNumberOrString("Texte",8,"#") //: Obtient ###Texte
On voit bien que cette methode presente un algorithme plus compact
elle tient compte de la partie negative en cas de nombre
mais ignore toujours la partie decimale
Enfin voila une autre methode plus complete :
function padNum2(toPad,formatLength,includeDecimal){
function padCallBack(str ,minus,integer,separator, decimal){
var ln=includeDecimal?str.length:integer.length
formatLength=formatLength/1||ln;
var zeropadLn=Math.max(formatLength,ln)-ln+1;
var formated=new Array(zeropadLn).join("0")+integer;
return minus+ formated+separator+decimal;
}
return toPad/1
?toPad.toString().replace(/^(-?)(\d*)([\.|,]?)(\d*)$/g, padCallBack)
:padCallBack(toPad,"",toPad,"","");
}
padNumberOrString(-1.23,4) //: Obtient -1.23 la longueur totale
padNumberOrString(-1.23,4,true) //: Obtient -0001.23 que la partie entiere
padNumberOrString("-1.23",4) //: Obtient -1.23 ne tient pas compte de la partie decimale
padNumberOrString("-1.23",5) //: Obtient -01.23
padNumberOrString(10,2) //: Obtient 10
padNumberOrString(10,1) //: Obtient 10
padNumberOrString(10,4,true) //: Obtient 0010
padNumberOrString(4e2,4,true) //: Obtient 0400
padNumberOrString("Texte",8) //: Obtient 000Texte
On voit que cette methode tient compte a la fois de la partie decimale
grace au parametre
includeDecimal de la partie et entiere ,
ansi que signe moins et de nombre flottants (4e10).
0 commentaires:
Enregistrer un commentaire