My current project has several pages where I need to grab values from textboxes, calculate a percentage, and then display the percentage in a label. So I needed to write a Javascript function to do that.

As always, I relied on Google, as I’m not a Javascript expert, and find it easier to start with other people’s code than figure out all the details myself. So I found a nifty little bit of code that formats a decimal as a percentage using Math.round. All well and good, except my client wants some percentages to always have two decimals, even when the calculated value is a whole number. And, of course, Math.round rounds to the nearest integer – no remainders.

So I found another nifty little bit of code that allows you to round to however many decimal places you want, rather than just to the nearest integer. Better, but this code will return a whole number with no decimals when the calculated value is an integer, and I need two decimal places no matter what.

And so I found another neat bit of code, which uses the modulus operator to determine whether the value is an integer – if it is, then I’ll add the “.00” manually.

Just a couple more wrinkles – in this application, when the values in the texboxes are negative numbers, they will be formatted as (100), rather than -100. And, sometimes the client wants two decimals, and sometimes he wants no decimals.

So I put it all together as follows (a previous function – not shown – does the calculation, and sends the calculated value to the function below):

function formatPercent(value, noDecimal)

{

//set default flag value

var isNegNum = false;

//set default multiplier value (will produce result with 2 decimal places)

var mult = 100;

//if neg number (begins with paren)…

if (value.substring(0,1) == “(“)

{

//set flag to true

isNegNum = true;

//remove parens from value

value = value.replace(/(/,”);

value = value.replace(/)/,”);

}

//if no decimals wanted (‘noDecimal’ param has a value), set multiplier to 1

//(will produce result with no decimals)

if (noDecimal != null) {mult = 1;}

//format percent (‘mult’ variable determines whether has 2 or 0 decimals)

var result = Number(value)*100;

result = Math.round(result*mult)/mult;

//if decimals wanted (‘noDecimal’ param doesn’t have a value) and result

//is a whole number, manually add decimals

if (noDecimal === undefined && isInt(result) == true)

{

result = result + “.00”

}

//add minus sign to neg number

if (isNegNum == true)

{

result = “-” + result;

}

//add percent sign

result = result + “%”

//return formatted percent

return result;

}

function isInt(num)

{

// get the modulus

var mod = num % 1;

//if it’s 0, then it’s an integer

if (mod == 0) {

return true;

} else {

return false;

}

}

To use this function, send in the value that you want to be formatted as the first argument. If you want the formatting to contain two decimal places, then don’t send anything in for the second (‘noDecimal’) argument. If you want no decimals, then send in something for this second argument (doesn’t really matter what, as the function only checks to see if the parameter is null or not – I’ve been sending the string “true”).