/**********************\ * Auteur: vermine * * Co-Auteurs: * * www.developpez.com * * (javatwister) * * Créaton: juin 2010 * * ------------------ * * But: Format.String * \**********************/ //--------------------------------------------------------------- // Combinaisons possibles: //--------------------------------------------------------------- // - Chaine de caractères avec casse éventuelle: // * %s : ne rien faire à la chaine // * %sl: mettre en miniscules // * %su: mettre en majuscules // * %sx: première lettre en majuscule, le reste en miniscules // - Nombre entier avec base éventuelle (sur 2 digit): // * %d : base par défaut à 10 // * %d2, %d10, ... // - Nombre à x chiffres après la virgule: // * %f.x: utilisation du point (1.25) // * %f,x: utilisation de la virgule (1,25) // - Formatage de date: // * %d('format'): accepte un objet Date et un format // * $dd : numéro du jour // * $ddd : nom du jour // * $mm : numéro du mois // * $mmm : nom du mois // * $yy : deux derniers chiffres de l'année // * $yyyy : années sur quatre chiffres // * $hh : heures // * $PM : heures format AM/PM // * $mi : minutes // * $ss : secondes // * $milli: millisecondes //--------------------------------------------------------------- //chaine1: la chaine avec les tags //parametres: tableau avec les valeurs par tags de type "%" (les "$" se servent dans l'objet Date) // les valeurs doivent être déclarées dans l'ordre des tags //type_format: "date" pour les dates, "autres" pour le reste function format_string(chaine1, parametres, type_format) { //Déclaration de variables selon le type if(type_format == "date") { var reg_exp_total = /\$dd\b|\$ddd|\$mm\b|\$mmm|\$yy\b|\$yyyy|\$hh|\$PM|\$mi\b|\$ss|\$milli/g; var reg_exp = /\$dd\b|\$ddd|\$mm\b|\$mmm|\$yy\b|\$yyyy|\$hh|\$PM|\$mi\b|\$ss|\$milli/; var param; var pos = 2; var jours = new Array("lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"); var mois = new Array("janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"); } else { var reg_exp_total = /%s\w?|%n\d*|%f[\.,]\d+|%d\('[^\)]+'\)/g; var reg_exp = /%s\w?|%n\d*|%f[\.,]\d+|%d\('[^\)]+'\)/; var j = 0; var pos = 1; } var chaine2 = chaine1; var chaine3 = chaine1; var l = []; // tableau vide; var q = 0; // variable sauvegardant le nombre de caractères retranchés à "chaine"; if(chaine1.match(reg_exp_total) != null) var occurences = chaine1.match(reg_exp_total).length; // nombre de correspondances dans la chaîne; else return "Erreur concordance tags et/ou paramètres"; // vérification du nombre de paramètres if(type_format == "date") { if(occurences < 1) return "Erreur format date"; } else { if(parametres.length != occurences) return "Erreur de paramètres"; } //Parcours des occurences while(occurences) { var r = chaine2.match(reg_exp); // 1ère correspondance trouvée if(type_format != "date") var param = parametres[j++]; switch(r[0].substr(1,pos)) { //Chaine de caractères case "s": //Casse if(r[0].length > 2) { if(r[0].substr(2) == "l") param = param.toLowerCase(); else if(r[0].substr(2) == "u") param = param.toUpperCase(); else if(r[0].substr(2) == "x") param = param.substr(0,1).toUpperCase() + param.substr(1).toLowerCase(); else return "Erreur de casse: l, u ou x"; } break; //Nombre entier case "n": //Base if(r[0].length > 2) param = parseInt(param, parseInt(r[0].substr(2), 10)); break; //Nombre à virgule case "f": if((param+"").indexOf(",") > -1) param = (param+"").replace(",","."); //Nombre de virgule if(parseInt(r[0].substr(3), 10) > 20) return "Erreur, décimales limitées à 20"; param = parseFloat(param).toFixed(parseInt(r[0].substr(3), 10)); //Point ou Virgule ? if(r[0].substr(2,1) == ",") param = (param+"").replace(".",","); else param = (param+"").replace(",","."); break; //Objet Date case "d": param = format_string(r[0].substr(4,r[0].length-6), param, "date"); if(param == "Erreur") return "Erreur de matching"; break; //Jour case "dd": //Nom if(r[0].length > 3) param = jours[parametres.getDay()-1]; else //Numéro param = parametres.getDate(); break; //Mois case "mm": //Nom if(r[0].length > 3) param = mois[parametres.getMonth()]; else //Numéro param = parametres.getMonth()+1; break; //Année case "yy": //quatre chiffres if(r[0].length > 3) param = parametres.getFullYear(); else //deux chiffres mais getYear() ne renvoie pas la même chose sur tous les navigateurs param = ((parametres.getYear()+"").length == 2 ? parametres.getYear() : (parametres.getYear()+"").substr(2)); break; //Heures case "hh": param = parametres.getHours(); break; //Heures AM/PM case "PM": if(parametres.getHours() > 11) param = parametres.getHours() - 12; else param = parametres.getHours(); break; //Minutes - Millisecondes case "mi": //Millisecondes if(r[0].length > 3) param = parametres.getMilliseconds(); else //Minutes param = parametres.getMinutes(); break; //Secondes case "ss": param = parametres.getSeconds(); break; default: return "Erreur tag"; } //Ajout d'un zéro if(type_format == "date") param = ((param+"").length == 1 ? "0"+param : param); // ajout dans le tableau de l'expression trouvée avec sa position dans "chaine"; (Conservé au cas où) l.push(r[0]+" (position: "+(q+r.index)+")" ); // remplacement du tag par sa valeur chaine3 = chaine3.replace(reg_exp, param); q += r.index+r[0].length; // incrémentation de "q"; chaine2 = chaine1.substring(q);// on retranche les premiers caractères de chaine2, jusqu'à q; occurences--; } return chaine3; }