convertir un nombre en format monétaire
Dans le cadre de mes développements, j'ai été confronté au besoin de pouvoir convertir un nombre dans un format monétaire, tout en ayant la possibilité de choisir le type d'arrondi à utiliser (palier de 0 à x pour les centimes), ainsi que la précision de cet arrondi, pour le fun.
Par exemple, on pourra convertir un nombre à virgule en un arrondi (toujours à 2 chiffres après la virgule, puisque c'est un format monétaire que nous recherchons) à 50 centime, en décidant grace à la précision si notre arrondi vient se fixer à la valeur supérieure automatiquement ou si l'arrondi se fixe à la valeur la plus proche, en positif ou en négatif.
Voilà donc 2 fonctions, la première servant à formatter visuellement le nombre pour l'affichage, alors que la seconde arrondi un nombre avec les contraintes spécifiées par les arguments...
Je les laisse à tout hasard, ça pourra surement servir. Je me suis grandement inspiré d'un prototype de layer51 pour arriver à ce résultat, avec quelques modifications néamoins. J'imagine qu'il y a surement matière à optimiser ce code, et je reste à l'écoute de vos commentaires
function numberToCurrencyRound (n:Number, uom:String, uomafter:Boolean, centsRound:Number, precision:Boolean) { var x:Number = this.numberRound (n, centsRound, precision); var final:String = ""; var unitAndCents:Array = x.toString ().split ("."); var unit:String = unitAndCents [0]; var cents:String = (unitAndCents [1] != undefined ? unitAndCents [1] : "00"); var unitL:Number = unit.length; if (unitL>3) { var t:Array = unit.split (""); var index = 0; var result:String = ""; for (var i:Number = t.length-1; i >= 0; i--) { result = t [i] + result; index ++; if (index == 3 && i != 0) { result = "'" + result; index = 0; } } unit = result; } if (cents.length==1) cents = cents + "0"; final = unit + "." + cents; return (uomafter ? final + uom : uom + final) } function numberRound (n:Number, centsRound:Number, precision:Boolean):Number { var unit:String; var cents:String; var temp = n.toString(); var dot = temp.indexOf(".", 0); if (dot< =0) { unit = temp; cents = "00"; } else { unit = substring(temp, 0,dot); cents = substring(temp, dot+2,temp.length); } // manage cents of number if (cents.length>2) { a = Number (substring (cents, 2, 2)); if (centsRound != 0 && centsRound != undefined) { var flag:Boolean = true; var p:Number = a % centsRound; if (precision) flag = (centsRound / 2.0 > p ? false : true); if (flag) a += (centsRound - p); else a -= p; } if (a >= 100) { a -= 100 unit = String (Number (unit) + 1); } else if (a < 0) { a += 100; unit = String (Number (unit) - 1); } cents = String (a); } return Number (unit + "." + cents); }
et enfin, l'utilisation :
test = 1254339.1650166; trace (test); trace(numberToCurrencyRound(test, " CHF ", true, 5, true)); trace(numberToCurrencyRound(test, "£ "));
Merci, bien utile ce petit scritp
Ouép, y casse pas de brique, on peut surement faire mieux et plus optimisé et tout et tout, mais au moins, la, il est dispo