convertir un nombre en format monétaire

  • warning: array_map(): Argument #2 should be an array in /var/www/titouille.ch/www/modules/system/system.module on line 1050.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
  • warning: Invalid argument supplied for foreach() in /var/www/titouille.ch/www/includes/theme.inc on line 1845.
Portrait de titouille

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 Wink

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 &lt; 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 Smile

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 Wink