views:

985

answers:

3

How can I force the input's onchange script to run before the RangeValidator's script?

I want to prevent a failed validation when the user enters a dollar sign or comma.

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" />

UPDATE:
I decided to use a CustomValidator that checks the range and uses a currency RegEx. Thanks 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" />
A: 

There is a way to do this by registering the script; however why not use a Regular Expression Validator to make sure the input is proper?

Also, the Range validator executes on the fields onBlur js event, not on change.

Victor
RangeValidator restricts the salary from 0 to 1,000,000 (but I left that out of the markup in my post). This could probably be done within Regex, but the code is more readable using a range validator for that.
Robert Claypool
+1  A: 

Have you tried using a CustomerValidator control and combined the functionality of the JS cleanup methods and the RangeValidator method.

Michael Kniskern
A: 

Just noticed that you have a '.' for the decimal point, but that means the regex will accept any character in that spot. You should use \. for that decimal point.

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