formatowanie liczb w actionscript, cz.2
Przyjrzawszy się po raz drugi problemowi, popełniłem poniższą metodę, zastępując poprzednią.
Trochę inne podejście, wszystko objaśnione w kodzie. Dla dobra publicznego publikuję:
/**
* metoda formatuje liczbę z dokładnością zadaną przez @resolution,
* oddzielając tysiące znakiem z @thouSep a część ułamkową znakiem
* z @decPoint. Na końcu dodaje jednostkę @unit
* Np.:
* Format.Number(123.456, ' zł', 0.1) zwraca '123,5 zł'
* Format.Number(123.456, ' zł', 1) zwraca '123 zł'
* Format.Number(123.456, ' m', 10) zwraca '120 m'
*/
public static function number(
v: Number,
unit: String = '',
resolution: Number = 1,
decPoint: String = ',',
thouSep: String = ' '
):String
{
var r: String = '';
var rDec: String = '';
var rInt: String = '';
var i: int;
var rIntTmp:String;
var len: int;
v = Math.round(v / resolution) * resolution;
r = v.toString();
// pozycja kropki dziesiętnej
var decPointPos:int = r.lastIndexOf('.');
// część całkowita
if(decPointPos > -1)
rIntTmp = r.substr(0, decPointPos);
else
rIntTmp = r;
len = rIntTmp.length;
// przepisujemy po 3 cyfry, dodając separator
while(len > 3){
rInt = thouSep + rIntTmp.substr(len - 3, len) + rInt;
rIntTmp = rIntTmp.substr(0, len - 3);
len = rIntTmp.length;
}
rInt = rIntTmp + rInt;
// część ułamkowa
if(resolution < 1) {
// liczba znaków w części ułamkowej powinna być taka jak długość części ułamkowej @resolution
var decLength = (resolution - Math.floor(resolution)).toString().length - 2;
// część ułamkowa
if(decPointPos > -1){
var x:int = decPointPos + 1 + decLength;
rDec = r.substring(decPointPos + 1, decPointPos + 1 + decLength);
}
// dodajemy zera na końcu, jeśli trzeba
var zerosCount:int = decLength - rDec.length;
for(i = 0; i < zerosCount; i++) rDec += '0';
rDec = decPoint + rDec;
}
r = rInt + rDec + unit;
return r;
}