Format double constraited by maximum fraction digits
Author
Zhou Renjian
Create@
2005-01-27 17:02

// Do not round the double number.
function format(str, maxFDs) {
var eIndex = str.indexOf("e");
if (eIndex != -1) {
// *.*e*
var exp = parseInt(str.substring(eIndex + 1));
var dIndex = str.indexOf(".");
if (dIndex == -1) {
dIndex = eIndex;
}
var bPart = str.substring(0, dIndex);
var dPart = str.substring(dIndex + 1, eIndex);
if (exp > 0) {
// *.*e+*
if (dPart.length <= exp) {
// 1.023e+10
var zPart = "";
for (var i = 0; i < exp - dPart.length; i++) {
zPart += "0";
}
//alert(bPart + ":" + dPart + ":" + zPart);
return "" + bPart + dPart + zPart;
} else {
// 1.01234567e+5
if (dPart.length - exp > maxFDs) {
// maxFDs = 2
// *.0123456789e+5
var xPart = dPart.substring(0, exp) + "." + dPart.substring(exp, exp + maxFDs);
//alert(bPart + ":" + dPart + ":" + xPart);
return bPart + xPart;
} else {
// maxFDs = 2
// *.012345e+5
var xPart = dPart.substring(0, exp) + "." + dPart.substring(exp);
return bPart + xPart;
}
}
} else { // exp <= 0
exp = -exp;
var sPart = "";
if (str.indexOf("+") == 0 || str.indexOf("-") == 0) {
sPart = str.substring(0, 1);
bPart = bPart.substring(1, eIndex);
}
str = str.replace(/\./, "");
if (exp > maxFDs) {
//1.02342e-10 with maxFDs = 3
return "0";
} else {
//1.02342e-3 with maxFDs = 5
var zPart = "";
for (var i = 0; i < exp - 1; i++) {
zPart += "0";
}
if (dPart.length + exp > maxFDs) {
//1.02342e-3 with maxFDs = 5
dPart = dPart.substring(0, maxFDs - exp);
//alert(sPart + ":" + "0." + ":" + zPart + ":" + bPart + ":" + dPart)
return sPart + "0." + zPart + bPart + dPart;
} else {
//1.02e-3 with maxFDs = 5
return sPart + "0." + zPart + bPart + dPart;
}
}
}
} else {
var dIndex = str.indexOf(".");
if (dIndex == -1) {
return str;
} else {
var bPart = str.substring(0, dIndex);
var dPart = str.substring(dIndex + 1);
if (dPart.length > maxFDs) {
dPart = dPart.substring(0, maxFDs);
if (maxFDs != 0) {
return bPart + "." + dPart;
} else {
return bPart;
}
} else {
return str;
}
}
}
}
// passed
alert(format("1.023e+10") == "10230000000");
alert(format("1.0123456789e+5", 2) == "101234.56");
alert(format("1.012345e+5", 2) == "101234.5");
alert(format("1.02342e-10", 2) == "0");
alert(format("1.02342e-3", 5) == "0.00102");
alert(format("1.02e-3", 5) == "0.00102");
alert(format("1.023423", 5) == "1.02342");
alert(format("1.023", 5) == "1.023");
alert(format("231.023", 1) == "231.0");
alert(format("231.023", 0) == "231");