Newsgroup: it.comp.lang.javascript
Titolo: Problemi con funzione di auto-formattazione dei numeri.

Grazie in anticipo a chi avrà voglia di cimentarsi a darmi una mano su 
questi tre problemi che ho su questa funzione
Paolo
La funzione qui sotto serve a formattare un valore numerico con il 
separatore delle migliaia e dei decimali.
Funziona bene ma presenta una serie di problemi:
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Problema 1.
La funzione inserisce in automatico il separatore dei decimali (che 
viene passato nell' input del form come
onKeyPress="return(currencyFormat(this,',','.',event))"
Questo è un problema perché se l'utente scrive mille, questo diventa 10.00
Bisognerebbe trovare un modo per far inserire il separatore dei decimali 
solo quando l'utente lo digita.
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Problema 2.
Così com'è la funzione supporta solo i numeri a due decimali, ma sarebbe 
preferibile passargli il numero dei decimali dalla funzione.
Ad esempio ho provato ad aggiungere l'argomento decSepPos alla funzione
currencyFormat (che è certamente la strada da seguire) e a fare le 
modifiche seguenti:
------------
riga 7:
function currencyFormat(fld, milSep, decSep, e) {
diventa
function currencyFormat(fld, milSep, decSep, decSepPos, e) {
-----------
riga 44:
fld.value += decSep + aux.substr(len - 2, len);
diventa
fld.value += decSep + aux.substr(len - decSepPos, len);
--------------
riga 59:
onKeyPress="return(currencyFormat(this,',','.',event))">
diventa
onKeyPress="return(currencyFormat(this,',','.','3',event))">
dove '3' è chiaramente un esempio.
Questa modifica funziona ma solo quando decSepPos è >= 2, mentre se è 
uno o zero la funzione smette di operare come voluto.
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Problema 3.
In firefox il tasto TAB non funziona (mentre in ie si).
Questo implica il non poter passare da un input all'altro da tastiera.
Ho provato ad aggiungere sotto riga 16 il seguente codice:
if (whichCode == 9) return true; // (9 è il keycode del tasto TAB)
Senza ottenere il risultato voluto.
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Qui sotto la pagina su cui sto lavorando.
Un grazie a chi mi vorrà dare una mano
Paolo
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
<HTML>
<HEAD>
<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); // Valore del tasto dal keycode
if (strCheck.indexOf(key) == -1) return false; // Chiave non valida
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>
</HEAD>
<BODY>
<form>
Inserisci valore:
<input type="text" name="test" length="15" 
onKeyPress="return(currencyFormat(this,',','.',event))">
</form>
</BODY>
</HTML>

 onKeyPress="return(currencyFormat(this,',','.',event))">
vuoi un consiglio? lascia perdere, ti porti dietro solo guai ... al massimo
usa onchange (dovrebbe scatenarsi quando perde il focus), ma se pensi che
ad ogni tasto premuto gli sistemi tutta la scritta non ne esci, troverai
una marea di eccezioni che ti faranno diventare matto.
Personalmente io metterei accanto al text uno span dove scrivere il
risultato (anzi, a dir la verità io non capisco perché mai se mi sta
digitando un numero devo in tempo reale mettergli i separatori delle
migliaia ... )
-- 
"Ho smesso di fumare.
 Vivrò una settimana di più.
 E in quella settimana pioverà a dirotto"
									    W.A.