Go Premium for a chance to win a PS4. Enter to Win

x
Solved

# I get NAN not a number when I enter 0 zero in the money field

Posted on 2007-12-04
Medium Priority
367 Views
Hello Everyone, this function computes my percentages, but if I enter 0 (zero)  in the money field I get NAN in the percentage field, now I knwo the total percentage needs to be 100% at all times but NAN is not good, can the field remain blank ?

Or is there another way to fix this problem?

``````<script>
//------------------------------------------------------------------
// Name: CurToNum()
// Role: Convert specified currency value to the equivalent numeric
//       value.
//------------------------------------------------------------------

function CurToNum( val ) {
val = val.replace(/\\$|\,/g,'');
return parseFloat( val );
}

//------------------------------------------------------------------
// Name: formatCurrency()
// Role: Convert specified numeric value to the equivalent currency
//       value.
//------------------------------------------------------------------
function formatCurrency( num ) {
num = num.toString().replace(/\\$|\,/g,'');
if( isNaN( num ) )
num = "0";
sign = ( num == ( num = Math.abs( num ) ) );
num = Math.floor( num * 100 + 0.50000000001 );
cents = num % 100;
num = Math.floor( num / 100 ).toString();
if ( cents < 10 )
cents = "0" + cents;
for ( var i = 0; i < Math.floor( ( num.length - ( 1 + i ) ) / 3 ); i++ )
num = num.substring( 0, num.length -( 4 * i + 3 ) ) + ',' +
num.substring( num.length - ( 4 * i + 3 ) );
return ( ( ( sign ) ? '' : '-' ) + num  );
}

//------------------------------------------------------------------
// Name: field()
// Role: Locate the DOM element having the specified id attribute.
//------------------------------------------------------------------
function field( id ) {
var obj = document.getElementById( id );

if ( obj == null ) {
}
return obj;
}

//------------------------------------------------------------------
// Global arrays of ids of the data, and associated percentage
// fields, and the ids of the overall total output field, as well as
// the totalPercentage output field.
//------------------------------------------------------------------
var dataIds = 'POEMoney,LandMoney'.split( ',' );
var perIds  = 'POEPercentage,LandPercentage'.split( ',' );
var totalId = 'TotalMoney';
var totalPercentId = 'TotalPercentage';

//------------------------------------------------------------------
// Name: Compute()
// Role: Calcuate the total of the currency fields, then display the
//       associated percentage values
// Note: document.getElementById() is used to locate the single DOM
//       (Document Object Model) element that has the specified
//       (unique) id attribute specified.
//------------------------------------------------------------------
function Compute() {

if ( dataIds.length != perIds.length ) {
alert( 'Data/percentage fields have different number of elements.' );
} else {
var totField = field( totalId );

// gives me the total which is zero right now, why is that?
// Because we haven't yet assigned the value.

var total = 0;
var count = 0;

//--------------------------------------------------------------
// Since you are using unique name attributes for the "data"
// fields, we are using a list of ids to identify each and every
// data field to be processed.
// Each element of dataIds is the id attribute of a single data
// element.
//--------------------------------------------------------------
for ( var i = 0; i < dataIds.length; i++ ) {
var val = field( dataIds[ i ] ).value;
//alert( 'i: ' + i + ' = "' + dataIds[ i ] + '" => ' + val );  //<-----Angie Test

//------------------------------------------------------------
// If this field has data, convert the content to its
// equivalent numeric value, and add this value to the total.
//------------------------------------------------------------
if ( val != '' ) {
total += CurToNum( val );
count++;
}
}
//--------------------------------------------------------------
// Assign the "overall total" using the computed sum.
//--------------------------------------------------------------
totField.value = formatCurrency( total );

//--------------------------------------------------------------
// Now, compute each of the associated percentage values
//--------------------------------------------------------------
for ( i = 0; i < perIds.length; i++ ) {
var val = field( dataIds[ i ] ).value;
//------------------------------------------------------------
// If this field has data, compute the percentage of the total
// it represents, and display this in the associated percent
// field.
//------------------------------------------------------------
// Note: If you show too few decimal places for these % output
//       fields, the sum of the percentage output fields may
//       not add up to 100%
//------------------------------------------------------------
if ( val != '' ) {
var per = ( CurToNum( val ) * 100 / total );
field( perIds[ i ] ).value = per.toFixed( 0 );
}
}
field( totalPercentId ).value = '100';
}
}
</script>

<tr>
<td><input type = "text" name = "Expenses" id = "Expenses"  size = "50"  value = "<%=sExpenses%>"  /></td>
<td align = "right"> <span id="rInputs">
<input type='text' name='POEMoney' id='POEMoney' maxlength = "9"  size = "11"  class='money' onblur='this.value=formatCurrency(this.value); Compute();'   value = "<%=sPOEMoney%>"  />
</span></td>
<td align = "right"><span id="rInputs">
<input type = "text"  name = "POEPercentage" id = "POEPercentage" readonly  maxlength = "5" size = "5"   value = "<%=sPOEPercentage%>" />
</span></td>
</tr>
<tr>
<td><input type = "text" name = "Land"  id = "Land" value = "<%=sLand%>" size = "50" /></td>
<td align = "right"><span id="rInputs">
<input type = "text" name = "LandMoney" id = "LandMoney" maxlength = "9"  size = "11"  class="money" onblur='this.value=formatCurrency(this.value); Compute();'   value = "<%=sLandMoney%>" />
</span></td>
<td align = "right"><span id="rInputs">
<input type = "text" name = "LandPercentage" id = "LandPercentage" readonly maxlength = "5" size = "5"   value='<%=sLandPercentage%>' />
</span></td>
</tr>

<tr>
<td><strong>Total Project Costs:
</td>
<td align = "right"><span id="rInputs">
<input type = "text" readonly style = "background: #CCCCCC" name = "TotalMoney" id = "TotalMoney" maxlength = "11" size = "14" class="money" onblur="this.value=formatCurrency(this.value);"  value = "<%=sTotalMoney%>" />
</span></td>
<td align = "right"><span id="rInputs">
<input type = "text" readonly style = "background: #CCCCCC" name = "TotalPercentage" id = "TotalPercentage"  maxlength = "4" size = "5" value = "<%=sTotalPercentage%>" />
</span></td>
</tr>
``````
0
Question by:Gemini532
• 2
• 2

Author Comment

ID: 20404631
I have no questions, I just wander why when I add zero to the money fields it gives me NAN in the percentage field, zero is still a number, so why the discrepancy??!
0

LVL 54

Accepted Solution

b0lsc0tt earned 2000 total points
ID: 20408021
The problem in this code was trying to divide by zero.  There are a few ways to fix this but the simplest is with an If.  I have placed it in with you code to see where the problem is and an easy fix.

// Note: If you show too few decimal places for these % output
//       fields, the sum of the percentage output fields may
//       not add up to 100%
//------------------------------------------------------------
if (total == 0 ) {
break;
}
if ( val != '' ) {
var per = ( CurToNum( val ) * 100 / total );
field( perIds[ i ] ).value = per.toFixed( 0 );

Notice the problem is when total is used as a denominator (bottom part of division).  If the number is 0 then NaN is the result.

Let me know if you have a question or need more help correcting it.

bol
0

Author Closing Comment

ID: 31412619
GREAT CATCH!! THANK YOU!
0

LVL 54

Expert Comment

ID: 20421773
Your welcome!  I'm glad I could help.  Thanks for another fun question, the grade and the points.

bol
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Today, the web development industry is booming, and many people consider it to be their vocation. The question you may be asking yourself is – how do I become a web developer?
In this blog, we’ll look at how improvements to Percona XtraDB Cluster improved IST performance.
The viewer will learn the benefit of using external CSS files and the relationship between class and ID selectors. Create your external css file by saving it as style.css then set up your style tags: (CODE) Reference the nav tag and set your prop…
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …
###### Suggested Courses
Course of the Month12 days, 20 hours left to enroll