Liveupdate phone number forms and test for international numbers I took a base from here and built on it. You call the function with onkeypress (hence live changing).

The function gives output like this for domestic numbers:


  (123) 456–7890


When the numbers pass the above character limit (13), the function outputs international numbers like this:


  +12 (345) 678-9012


It doesn't handle backspacing elegantly (reformatting), which is on my to-do list.  I'm looking for feedback on how to improve.

 var mask = function(content) {
      var val = content.value.split('');
      if (val.length &gt; 13) {
        tel = '+'
      }
      else {tel = '('}
      for(var i=0; i&lt; val.length; i++) {
        if(val[i] == '+'){
          val[i]='';
        }
        if(val[i] =='('){
          val[i]='';
        }
        if(val[i]==')'){
          val[i]='';
        }
        if(val[i]==' '){
          val[i]='';
        }
        if(val[i]=='-'){
          val[i]='';
        }
      }
      for(var i=0; i&lt;val.length; i++){
          if (i==3){
            if (val.length&gt;13) {
            val[i]= ' (' + val[i]; 
            }
            else {
            val[i]=val[i]+') ';
            }
          }
          if (i==7){
            if (val.length&gt;13) {
            val[i]= val[i] + ') ';
              if (val[i+2] == '–') {
                val[i+2]='';
                val[i+5]='–'
              }
            }
          }
          if(i==8 &amp;&amp; val[i+1] != '–'){
            if (val.length &lt;= 13) {
            val[i]=val[i]+'–';
            }
          }
          tel=tel+val[i];
      }
      content.value=tel;
    };
Regular expressions are a quicker way to get it done. Here's a naïve implementation that's (I believe) functionally equivalent to yours:

var mask = function (content) {
  var val = content.value.replace(/[^\d]/g, ''); // Remove anything that's not a digit
  if( val.length &lt;= 10 ) { // US number
    content.value = val.replace(/^(\d{3})(\d{3})(\d*)$/, '($1) $2-$3');
  } else { // Other
    content.value = val.replace(/^(\d{2})(\d{3})(\d{3})(\d*)$/, '+$1 ($2) $3-$4');
  }
};


Here's a live demo

But this is far, far from perfect. There are many, many things to consider.

For starters, non-US numbers aren't necessarily longer than US ones. My own number is just 8 digits (or 10, if you count the country digits - or 12 if you use "00xx" instead of "+xx" for the country code). So if I wrote my phone number (as I normally would) as "+xx xx xx xx xx", it'd be formatted as a US number - which it isn't. If I wrote "00xx xx xx xx xx", I'd get "+00 ...", which is also wrong since it's an invalid country code.

On top of that, there's a ton of different local conventions for how to write phone numbers.

Point is that you can't go by the phone-number-length alone.

Regardless of how far you want to go with it, though, regular expressions will come in handy. Here's a nice interactive reg exp demo/tester to get you started.