Hello and welcome to our community! Is this your first visit?
Enjoy an ad free experience by logging in. Not a member yet? Register.

# Thread: Problem(s) on number auto-format function.

1. ## Problem(s) on number auto-format function.

Thanks in advance to everyone that will give me help for these questions.

The function formatCurrency is used to auto-format a numeric value with thousands separators and a decimal separator.

It works, but still has the following problems:

°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

Problem 1.

The function automatically inserts the decimal separator
Code:
`onKeyPress="return(currencyFormat(this,',','.',event))" //(where '.' is the decsep)`
This is a problem because when a user tries to write 1000 (one thousand) it is formatted as 10.00.

I need to modify the function so that it inserts the digit decSep only when the user digits the decSep key.

°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

Problem 2.

As it is the function only supports numbers with two decimals, but it would be useful to pass the decimal position as an argument of the function itself.

I tried to add the argument decSepPos (decimal separator position)
and modify the function in these way:

------------

Line 7:
Code:
`function currencyFormat(fld, milSep, decSep, e) {`
Becomes
Code:
`function currencyFormat(fld, milSep, decSep, decSepPos, e) {`
-----------
line 44:
Code:
`fld.value += decSep + aux.substr(len - 2, len);`
becomes
Code:
`fld.value += decSep + aux.substr(len - decSepPos, len);`
--------------
line 59:
Code:
`onKeyPress="return(currencyFormat(this,',','.',event))">`
becomes
Code:
`onKeyPress="return(currencyFormat(this,',','.','3',event))">`
where '3' is clearly an example.
-------------------------------------------------

This modification works well, but only when decSepPos is >=2.
If the passed value is 1 or 0 the function stops working well.

°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

Problem 3.

In firefox the TAB key does not work (while it works in ie).
This implies not to be able to switch from a textbox to another object using the tab key.I tried to add line 16 the following line:
Code:
`if (whichCode == 9) return true; // (9 is the keycode of TAB key)`
Without obtaining any result.

°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Here is the sample page I'im working on
Thanks to everybody will support me on one or more of these problems.

Paolo

§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

Code:
```<HTML>

<SCRIPT LANGUAGE="JavaScript">

function currencyFormat(fld, milSep, decSep, e) {
var sep = 0;
var key = '';
var i = j = 0;
var len = len2 = 0;
var strCheck = '0123456789';
var aux = aux2 = '';
var whichCode = (window.Event) ? e.which : e.keyCode;
if (whichCode == 13) return true; // Enter
if (whichCode == 8) return true; // Delete
key = String.fromCharCode(whichCode); // take the key from  keycode
if (strCheck.indexOf(key) == -1) return false; // Unvalid key
len = fld.value.length;
for(i = 0; i < len; i++)
if ((fld.value.charAt(i) != '0') && (fld.value.charAt(i) != decSep)) break;
aux = '';
for(; i < len; i++)
if (strCheck.indexOf(fld.value.charAt(i))!=-1) aux += fld.value.charAt(i);
aux += key;
len = aux.length;
if (len == 0) fld.value = '';
//if (len == 1) fld.value = '0'+ decSep + '0' + aux;
//if (len == 2) fld.value = '0'+ decSep + aux;
if (len > 2) {
aux2 = '';
for (j = 0, i = len - 3; i >= 0; i--) {
if (j == 3) {
aux2 += milSep;
j = 0;
}
aux2 += aux.charAt(i);
j++;
}
fld.value = '';
len2 = aux2.length;
for (i = len2 - 1; i >= 0; i--)
fld.value += aux2.charAt(i);
fld.value += decSep + aux.substr(len - 2, len);
}
return false;
}

</script>

<BODY>

<form>
Input value:
<input type="text" name="test" length="15" onKeyPress="return(currencyFormat(this,',','.',event))">
</form>
</BODY>
</HTML>```

• Your script is extremely cumbersome! The following will format your currency:-

Code:
```<script type = "text/javascript">

var num = 1234567890123.45    //works with negative numbers as well and 3 decimal places so good for currency

document.write('<span id="count"></span>');

var rgx = /(\d+)(\d{3})/;
while (rgx.test(nStr)) {
nStr = nStr.replace(rgx, '\$1,\$2');
}
return nStr;
}

</script>```

BTW, the time to say "thanks" is afterwards, not beforehand which gives the impression that you take other people's unpaid assistance for granted. Or as British politician Neil Kinnock put it, "Don't belch before you have had the meal." Prefer to use "please" beforehand and if you find a response helpful then you can use the "Thank User For This Post" button.

When trouble arises and things look bad, there is always one individual who perceives a solution and is willing to take command. Very often, that individual is crazy.

• without a loop:
Code:
```function dollarize(n){
var s = n.toString();
var so = s.split(".");
s=Number(so[0]).toLocaleString();
return "\$" + s + "."+ (so[1] || "00" );
}

• ## Users who have thanked rnd me for this post:

paolo (10-17-2008)

• Originally Posted by rnd me
without a loop:
Code:
```function dollarize(n){
var s = n.toString();
var so = s.split(".");
s=Number(so[0]).toLocaleString();
return "\$" + s + "."+ (so[1] || "00" );
}

Alas, 20000000 returns \$20,000,000.00.00 and 20000000.99 returns \$20,000,000,00.99.

Suggest:-

Code:
```<script type = "text/javascript">

function dollarize(n){
var s = n.toString();
var so = s.split(".");
s=Number(so[0]).toLocaleString();
s = s.replace(/\..+/,"");
return "\$" + s + "."+ (so[1] || "00" );
}

</script>```

• ## Users who have thanked Philip M for this post:

paolo (10-17-2008)

• Originally Posted by Philip M
BTW, the time to say "thanks" is afterwards, not beforehand which gives the impression that you take other people's unpaid assistance for granted.
Hi Philip,

In Italian newsgroups this formula is very common; as far as I know nobody has reported to get that impression. Anyway I'll follow your suggestion in my future messages.

Paolo

•