Here are optimized versions. The general function is around 20% faster and the specific version for 3 decimals is 50% faster. Avoids creating strings and string concatenations as posible, and also avoids the division for precision issues
public static function floatToStringPrecision(n:Float,prec:Int)
{
if(n==0)
return "0." + ([for(i in 0...prec) "0"].join("")); //quick return
var minusSign:Bool = (n<0.0);
n = Math.abs(n);
var intPart:Int = Math.floor(n);
var p = Math.pow(10, prec);
var fracPart = Math.round( p*(n - intPart) );
var buf:StringBuf = new StringBuf();
if(minusSign)
buf.addChar("-".code);
buf.add(Std.string(intPart));
if(fracPart==0)
{
buf.addChar(".".code);
for(i in 0...prec)
buf.addChar("0".code);
}
else
{
buf.addChar(".".code);
p = p/10;
var nZeros:Int = 0;
while(fracPart<p)
{
p = p/10;
buf.addChar("0".code);
}
buf.add(fracPart);
}
return buf.toString();
}
The a specific function for the case prec=3
public static function floatToStringPrecision3(n:Float)
{
if(n==0)
return "0.000";
var minusSign:Bool = (n<0.0);
n = Math.abs(n);
var intPart:Int = Math.floor(n);
var p:Float = 1000.0; //pow(10, 3)
var fracPart = Math.round( p*(n - intPart) );
var buf:StringBuf = new StringBuf();
if(minusSign)
buf.addChar("-".code);
buf.add(Std.string(intPart));
if(fracPart==0)
buf.add(".000");
else
{
if(fracPart<10)
buf.add(".00");
else if(fracPart<100)
buf.add(".0");
else
buf.add(".");
buf.add(fracPart);
}
return buf.toString();
}