danik.js, да не,
рони нормальный вариант предложил, за что ему плюс в карму

Хотя, может быть в моем меньше замен/манипуляций производится, но в оптимизации сложнее.
Еще такой вариант на его основе
<input type="text" onkeyup="formattingNumbers( this )" value="+ 7 123 456-78-90">
<script>
function formattingNumbers( elem ) {
var pattern = '+ 7 123 456-78-90', arr = elem.value.match( /\d/g ), i = 0;
if ( arr === null ) return;
elem.value = pattern.replace( /\d/g, function( a, b ) {
if ( arr.length ) i = b + 1;
return arr.shift();
}).substring( 0, i );
}
</script>