2008-12-09 4 views
1

Comment puis-je forcer le script onchange de l'entrée à s'exécuter avant le script de RangeValidator?

Je souhaite empêcher une validation échouée lorsque l'utilisateur entre un signe dollar ou une virgule.

function cleanUp(str) { 
    re = /^\$|,/g; 
    return str.replace(re, ""); // remove "$" and "," 
} 

<input type="text" id="salary" runat="server" 
onchange="this.value=cleanUp(this.value)" /> 

<asp:RangeValidator ID="salaryValidator" 
    runat="server" ErrorMessage="Invalid Number" 
    ControlToValidate="salary" Type="Double" /> 

MISE À JOUR:
j'ai décidé d'utiliser un CustomValidator qui vérifie la gamme et utilise une expression régulière de devises. Merci Michael Kniskern.

function IsCurrency(sender, args) { 
    var input = args.Value; 

    // Check for currency formatting. 
    // Expression is from http://regexlib.com/REDetails.aspx?regexp_id=70 
    re = /^\$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$/; 
    isCurrency = input.match(re); 

    if (isCurrency) { 
     // Convert the string to a number. 
     var number = parseFloat(CleanUp(input)); 
     if (number != NaN) { 
      // Check the range. 
      var min = 0; 
      var max = 1000000; 
      if (min <= number && max >= number) { 
       // Input is valid. 
       args.IsValid = true; 
       return; 
      } 
     } 
    } 

    // Input is not valid if we reach this point. 
    args.IsValid = false; 
    return; 
} 

function CleanUp(number) { 
    re = /^\$|,/g; 
    return number.replace(re, ""); // remove "$" and "," 
}  

<input type="text" id="salary" runat="server" /> 

<asp:CustomValidator ID="saleryValidator" ControlToValidate="salary" runat="server" 
ErrorMessage="Invalid Number" ClientValidationFunction="IsCurrency" /> 

Répondre

3

Avez-vous essayé d'utiliser un contrôle CustomerValidator et combiné les fonctionnalités des méthodes de nettoyage JS et la méthode RangeValidator.

0

Il existe un moyen de le faire en enregistrant le script; Cependant, pourquoi ne pas utiliser un validateur d'expressions régulières pour s'assurer que l'entrée est correcte?

De plus, le validateur de plage s'exécute sur les champs onBlur js event, et non en cas de modification.

+0

RangeValidator limite le salaire de 0 à 1 000 000 (mais je l'ai laissé dans le balisage dans mon message). Cela pourrait probablement être fait dans Regex, mais le code est plus lisible en utilisant un validateur de plage pour cela. –

0

Juste remarqué que vous avez un '.' pour la virgule décimale, mais cela signifie que l'expression régulière acceptera n'importe quel caractère à cet endroit. Vous devez utiliser \. pour ce point décimal.

/^\$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(\.[0-9][0-9])?$/ 
3

Je pense que je peux améliorer cela. Cela rend les virgules et les centièmes numériques facultatifs:

^\$?([0-9]{1,3},?([0-9]{3},?)*[0-9]{3}|[0-9]+)(\.[0-9]{0,2})?$ 
Questions connexes