Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di fraude
    Registrato dal
    Feb 2004
    Messaggi
    2,870

    Numeri interi e decimali [R.E]

    Salve a tutti.

    Cosa sbaglio in questa Regular Expression?
    Perchè i campi del form mi accettano solo numeri interi e non decimali?

    Proprio non capisco... :master:

    codice:
    function validateNumber(fieldObj, customAlert, sep, dec)
    {
      // Solo numeri interi
      if (sep.length != 1) re = new RegExp("^\\s*(\\d+)\\s*$", "");
      
      // Numeri interi e float (separatore decimale definito da 'sep')
      else
        {
          if (dec > 0) re = new RegExp("^\\s*(\\d*\\" + sep + "\\d{" + dec + "})\\s*$", "");
          else re = new RegExp("^\\s*(\\d+(\\" + sep + "\\d+)?|\\" + sep + "\\d+)\\s*$", "");
        }
     
      var rt = fieldObj.value.match(re);
      if (!rt)
        {
          if (customAlert.length > 0) alert(customAlert);
          else alert("Il campo '" + fieldObj.name + "' deve contenere un numero!");
     
          fieldObj.value = "";
          fieldObj.focus();
          return(false);
        }
     
      fieldObj.value = rt[1];
      return(true);
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Mi pare un po' troppo complesso il tutto, per le RegExp.

    Ho l'impressione che basterebbe una unica RegExp.

    Pero` non ho capito cosa vuoi fare, dato che non so cosa sono i parametri passati.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it L'avatar di fraude
    Registrato dal
    Feb 2004
    Messaggi
    2,870
    Grazie Mich; provo a spiegarmi meglio:

    Ho una serie di campi di un form che devono soltanto necessariamente contenere dei numeri; questi numeri posso essere interi o quando decimali separati dal punto ed al massimo con due cifre dopo il punto.

    Con questa R.E. volevo prevedere le combinazioni possibili, ma in questi campi quando scrivo 0.03 mi parte la alert, vengono validati solo numeri interi.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Ecco la RE corretta:
    /\d+(\.\d{0,2})?/

    oppure:
    /\d*(\.\d{0,2})?/

    La prima richiede almeno un numero prima del punto, la seconda no.
    La seconda pero` accetta un campo completamente vuoto, per cui andrebbe modificata cosi`:
    /(\d*\.\d{0,2})|\d+/

    Forse a te serve raddoppiare le backslash.


    Quindi la funzione potrebbe diventare:
    codice:
    function validateNumber(fieldObj, customAlert) {
      if(fieldObj.value.match(/(\d*\.\d{0,2})|\d+/) return true;
      else {
        if(customAlert.length) alert(customAlert);
        else alert("Il campo '" + fieldObj.name + "' deve contenere un numero!");
        fieldObj.value = "";
        fieldObj.focus();
        return false;
      }
    }
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Utente di HTML.it L'avatar di fraude
    Registrato dal
    Feb 2004
    Messaggi
    2,870
    Grazie Mich, ma così il form parte anche che se i campi sono vuoti:
    codice:
    function validateNumber(fieldObj, customAlert)
     {
     
      if(fieldObj.value.match(/(\d*\.\d{0,2})|\d+/) return true;
      
      else 
      
      {
        if(customAlert.length) alert(customAlert);
        else alert("Il campo '" + fieldObj.name + "' deve contenere un numero!");
        
        fieldObj.value = "";
        fieldObj.focus();
        return false;
      }
    }
    
    // Array con i dati per le validazioni
    var validateTypes = new Array(
                                  
                                  new Array(validateNumber, "ssn", "camponr1", "", "", 0,
                                                                   "camponr2", "", "", 0,
                                                                   "camponr3", "", "", 0,
                                                                   "camponr4", "", "", 0,
                                                                   "camponr5", "", "", 0,
                                                                   "camponr6", "", "", 0,
                                                                   "camponr7", "", "", 0,
                                                                   "camponr8", "", "", 0,
                                                                   "camponr9", "", "", 0
                                                                   );

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non ho capito come chiami la funzione.

    La funzione come la ho rifatta io ha bisogno di due parametri: l'oggetto campo e (opzionale) il messaggio di errore (stringa).

    Il numero di decimali e` fisso a 0, 1 o 2, secondo quanto mi hai scritto sopra.

    L'oggetto campo deve essere un oggetto input di tipo text o hidden (anche texarea va bene, ma non credo ti interessi).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    Utente di HTML.it L'avatar di fraude
    Registrato dal
    Feb 2004
    Messaggi
    2,870
    La funzione la richiamo così:
    codice:
    <form name="test" method="post" action="insertest.asp" onsubmit="return(validateForm(this));">
    In cui validateForm è questa
    codice:
    function validateForm(frmObj)
    {
      for ( var n = 0 ; n < validateTypes.length ; n++ )
        {
          var arr = validateTypes[n];
     
          var parms = arr[1];         // Tipo di parametri da passare alla
                                      // funzione di validazione
     
          var cb = parms.length + 1;  // Numero di parametri supplementari
                                      // da passare alla funzione di validazione
     
          for ( var m = 2 ; m < arr.length ; m += cb )
            {
              var sEval = "var rt = arr[0](frmObj[arr[m]]";
     
              for ( var e = 1 ; e < cb ; e++ )
                {
                  switch(parms.substr(e - 1, 1))
                    {
                      case "s":  // Il parametro è una stringa
                          sEval += ", '" + arr[m + e] + "'";
                          break;
     
                      case "n":  // Il parametro è un numero (intero o float)
                      case "p":  // Il parametro è uno statement
                          sEval += ", " + arr[m + e];
                          break;
                    }
                }
     
              eval(sEval + ");");
              if (!rt) return(false);
            }
        }
     
      // Tutte le validazioni sono riuscite, abilita l'invio del FORM
      return(true);
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Che complicato!!
    Ma quello non lo hai fatto tu, o mi sbaglio?

    E mi mancano dei dati per capire cosa passi alla funzione.

    Tra l'altro la funzione eval() e` deprecata, per cui potresti trovare dei browser dove non funziona.

    Lasciando perdere la chiamata (che non e` facile capire cosa fa), e` meglio verificare cosa arriva nella funzione. Inserisco degli altert, per conoscere con che dati abbiamo a che fare:
    codice:
    function validateNumber(fieldObj, customAlert) {
      alert("oggetto:"+fieldObj.name+"  tipo:"+fieldObj.type+"  mess:"+customAlert);
    
      if(fieldObj.value.match(/(\d*\.\d{0,2})|\d+/) return true;
      else {
        if(customAlert.length) alert(customAlert);
        else alert("Il campo '" + fieldObj.name + "' deve contenere un numero!");
        fieldObj.value = "";
        fieldObj.focus();
        return false;
      }
    }
    Devi anche dire con che browser stai provando, perche` IE accetta anche errori che altri browwser non accettano.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  9. #9
    Utente di HTML.it L'avatar di fraude
    Registrato dal
    Feb 2004
    Messaggi
    2,870
    Originariamente inviato da Mich_
    Che complicato!!
    Ma quello non lo hai fatto tu, o mi sbaglio?
    Si è così... è una funzione ereditata scritta da altri... e mi sono accorto solo stamattina dell'anomalia...

    Ho modificato la funzione secondo tue indicazioni, ma il form parte senza controlli; utilizzo IE sono in rete intranet aziendale; a questo punto posto la pagina completa:
    codice:
     <html>
    <head>
    
    <script language="javascript" type="text/javascript">
    <!--
     
    function validateEmpty(fieldObj, customAlert)
    {
      // Se il campo non è vuoto, ritorna true (ok)
      if (fieldObj.value.length > 0) return(true);
     
      if (customAlert.length > 0) alert(customAlert);
      else alert("Il campo '" + fieldObj.name + "' è obbligatorio !");
     
      fieldObj.focus();
     
      return(false);  // Errore
    }
     
    
    function validateNumber(fieldObj, customAlert) {
      alert("oggetto:"+fieldObj.name+"  tipo:"+fieldObj.type+"  mess:"+customAlert);
    
      if(fieldObj.value.match(/(\d*\.\d{0,2})|\d+/) return true;
      else {
        if(customAlert.length) alert(customAlert);
        else alert("Il campo '" + fieldObj.name + "' deve contenere un numero!");
        fieldObj.value = "";
        fieldObj.focus();
        return false;
      }
    }
    
     
    function validateDate(fieldObj)
    {
      var re = new RegExp("^([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})$", "");
     
      var dt = fieldObj.value.match(re);
      if (!dt ||                      // formato non valido
          dt[1] < 1 || dt[1] > 31 ||  // giorno non corretto
          dt[2] < 1 || dt[2] > 12 ||  // mese non corretto
          dt[3] < 1980)               // anno non corretto (minore del 1980)
        {
          alert("La Data inserita non è corretta.");
          fieldObj.focus();
          fieldObj.select();
          return(false);
        }
     
      return(true);
    }
     
    
    
    function validateEmail(fieldObj)
    {
      var re = new RegExp("^[a-z][a-z0-9]*\\.[a-z][a-z0-9]*@xxxxx\\.it$", "i");
     
      if (!fieldObj.value.match(re))
        {
          alert("L'indirizzo Email inserito non è corretto.\nL'indirizzo email è obbligatorio nella forma \"nome.cognome@xxxxx.it\".");
          fieldObj.focus();
          fieldObj.select();
          return(false);
        }
     
      return(true);
    }
     
    // Array con i dati per le validazioni
    var validateTypes = new Array(
                                  new Array(validateEmpty, "s", "NOME_TR", "",
                                                                "C2H2_C2H4_PPM", "",
                                                                "CH4_H2_PPM", "",
                                                                "C2H4_C2H6_PPM", ""
                                                                ),
                                  new Array(validateNumber, "ssn", "POTENZA_MVA", "", "", 0,
                                                                   "O2_PPM", "", "", 0,
                                                                   "N2_PPM", "", "", 0,
                                                                   "CO_PPM", "", "", 0,
                                                                   "CO2_PPM", "", "", 0,
                                                                   "H2_PPM", "", "", 0,
                                                                   "CH4_PPM", "", "", 0,
                                                                   "C2H6_PPM", "", "", 0,
                                                                   "C2H4_PPM", "", "", 0,
                                                                   "C2H2_PPM", "", "", 0
                                                                   ));
     
    function validateForm(frmObj)
    {
      for ( var n = 0 ; n < validateTypes.length ; n++ )
        {
          var arr = validateTypes[n];
     
          var parms = arr[1];         // Tipo di parametri da passare alla
                                      // funzione di validazione
     
          var cb = parms.length + 1;  // Numero di parametri supplementari
                                      // da passare alla funzione di validazione
     
          for ( var m = 2 ; m < arr.length ; m += cb )
            {
              var sEval = "var rt = arr[0](frmObj[arr[m]]";
     
              for ( var e = 1 ; e < cb ; e++ )
                {
                  switch(parms.substr(e - 1, 1))
                    {
                      case "s":  // Il parametro è una stringa
                          sEval += ", '" + arr[m + e] + "'";
                          break;
     
                      case "n":  // Il parametro è un numero (intero o float)
                      case "p":  // Il parametro è uno statement
                          sEval += ", " + arr[m + e];
                          break;
                    }
                }
     
              eval(sEval + ");");
              if (!rt) return(false);
            }
        }
     
      // Tutte le validazioni sono riuscite, abilita l'invio del FORM
      return(true);
    }
     
    function update_field(val1, val2, dst_field)
    {
      if (isNaN(val1) || isNaN(val2)) dst_field.value = "";
      else if (val2 == 0.0) dst_field.value = "*Attenzione, divisione per zero*";
      else dst_field.value = val1 / val2;
    }
     
    function calcola_rapporti()
    {
      // Recupero i valori dai campi A, B, C
      var H2_PPM = parseFloat(document.rapporti.H2_PPM.value);
      var CH4_PPM = parseFloat(document.rapporti.CH4_PPM.value);
      var C2H6_PPM = parseFloat(document.rapporti.C2H6_PPM.value);
      var C2H4_PPM = parseFloat(document.rapporti.C2H4_PPM.value);
      var C2H2_PPM = parseFloat(document.rapporti.C2H2_PPM.value);
     
      update_field(C2H2_PPM, C2H4_PPM, document.rapporti.C2H2_C2H4_PPM);
      update_field(CH4_PPM, H2_PPM, document.rapporti.CH4_H2_PPM);
      update_field(C2H4_PPM, C2H6_PPM, document.rapporti.C2H4_C2H6_PPM);
    }
     
    var timeoutID = null;
     
    // flTimeout è true solo se i methods window.setTimeout() e window.clearTimeout()
    // sono implementati dalla versione corrente del DOM (browser del cliente)
    var flTimeout = (typeof(window.setTimeout) != "undefined" &&
                     typeof(window.clearTimeout) != "undefined");
     
    function delayedUpdate()
    {
      // Se il tempo di timeout è in corso, resettalo
      if (timeoutID != null) window.clearTimeout(timeoutID);
     
      // Differisci 'calcola_rapporti()' di 400 millisecondi se il method 'window.setTimeout()'
      // è implementato, in caso contrario, invoca 'calcola_rapporti()' direttamente
      if (flTimeout) timeoutID = window.setTimeout("timeoutID = null; calcola_rapporti();", 400);
      else calcola_rapporti();
    }
     
    //-->
    </script>
    
    <body>
    
    <form name="rapporti" method="post" action="insertest.asp" onsubmit="return(validateForm(this));">
    
      <input type="text" name="NOME_TR" size="20"> NOME_TR
    
    
      <input type="text" name="POTENZA_MVA" size="20"> POTENZA_MVA
    
      <input type="text" name="O2_PPM" size="20" onkeyup="delayedUpdate();"> O2_PPM
    
      <input type="text" name="N2_PPM" size="20" onkeyup="delayedUpdate();"> N2_PPM
    
      <input type="text" name="CO_PPM" size="20" onkeyup="delayedUpdate();"> CO_PPM
    
      <input type="text" name="CO2_PPM" size="20" onkeyup="delayedUpdate();"> CO2_PPM
    
      <input type="text" name="H2_PPM" size="20" onkeyup="delayedUpdate();"> H2_PPM
    
      <input type="text" name="CH4_PPM" size="20" onkeyup="delayedUpdate();"> CH4_PPM
    
      <input type="text" name="C2H6_PPM" size="20" onkeyup="delayedUpdate();"> C2H6_PPM
    
      <input type="text" name="C2H4_PPM" size="20" onkeyup="delayedUpdate();"> C2H4_PPM
    
      <input type="text" name="C2H2_PPM" size="20" onkeyup="delayedUpdate();"> C2H2_PPM
    
    
      <input type="text" name="C2H2_C2H4_PPM" readonly size="20"> C2H2_C2H4_PPM (C2H2_PPM / C2H4_PPM)
    
      <input type="text" name="CH4_H2_PPM" readonly size="20"> CH4_H2_PPM (CH4_PPM / H2_PPM)
    
      <input type="text" name="C2H4_C2H6_PPM" readonly size="20"> C2H4_C2H6_PPM (C2H4_PPM / C2H6_PPM)
    
    
     
      <input type="image" src="img/salva_button.gif" width="84" height="16">
    </form>
     
    </body>
    </html>
    P.S. = nel form mancano i campi email e data_prelievo che sono richiamati nelle funzioni di controllo, ma che funzionano regolarmente e nulla hanno a che vedere con l'errore presentato dal form.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Mi spiace. Troppe cose furori standard.

    Io ho sempre scritto in JS, mentre tu usi un linguaggio ibrido (che somiglia a Jscript). Io non riesco a seguirti.

    Ad esempio la funzione return() in JS non esiste, mentre nel tuo script continui ad usarla.
    La funzione eval() e` deprecata.

    Altri problemi (di tipo masochistico)
    La matrice validateTypes viene definita globale a meta` script, e poi copiata in un'altra matrice nella funzione validateForm().

    E per finire alla funzione validateNumber vengono passati parametri del tipo sbagliato o non definiti completamente (forse pero` IE se li mangia lo stesso).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.