Campo numérico tipo Internet Banking

Preenche o campo numérico da direita para esquerda pemitindo sinal, formatando e limitando o tamanho

by Luis Felipe Morais

HTML

[0,2] R$
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '', false, 0, 2, event);">
<br />
[0,2] Obriga negativo
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '-', true, 0, 2, event);">
<br />
[0,2] Permite negativo
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '+-', false, 0, 2, event);">
<br />
[0,2] Permite negativo e positivo e obriga algum sinal
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '+-', true, 0, 2, event);">
<br />
<br />
[3,2] R$
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '', false, 3, 2, event);">
<br />
[3,2] Obriga negativo
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '-', true, 3, 2, event);">
<br />
[4,1] Permite negativo
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '+-', false, 4, 1, event);">
<br />
[5,4] Permite negativo e positivo e obriga algum sinal
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '+-', true, 5, 4, event);"><br />
<br />
<br />
[6,2] R$
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '', false, 6, 2, event);">
<br />
[3,0] Obriga negativo
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '-', true, 3, 0, event);">
<br />
[4,0] Permite negativo
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '+-', false, 4, 0, event);">
<br />
[5,0] Permite negativo e positivo e obriga algum sinal
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '+-', true, 5, 0, event);">
<br />
<br />
[-1,2] R$
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '', false, -1, 2, event);">
<br />
[-1,0] Obriga negativo
<input type="text" name="valor" onKeyDown="return mascaraNumerica(this, '.', ',', '-', true,...

JavaScript

function getChar(event) {
    if (event.which === null) {
        return event.keyCode;
    } else if (event.which !== 0 && event.charCode !== 0) {
        return event.which;
    } else if (event.location == 3) {
        if (event.keyCode == 109) //-
            return 45;
        if (event.keyCode == 107) //+
            return 43;
        if (event.keyCode == 110) //,
            return 220;
        
        return event.keyCode - 48; //números do teclado numérico
    } else {
        if (event.keyCode == 189) //-
            return 45;
        if (event.keyCode == 187 && event.shiftKey) //+
            return 35;
        if (event.keyCode == 188) //.
            return 190;
        if (event.keyCode == 190 ) //,
            return 44;
        
        return event.keyCode;
    }
}

function mascaraNumerica(objTextBox, separadorMilesimo, separadorDecimal, sinais, obrigatorio, casasInteiras, casasDecimais, e) {
    var sep = 0;
    var key = '';
    var i = 0;
    var j = 0;
    var len = 0;
    var len2 = 0;
    var strCheck = '0123456789';
    var aux = '';
    var aux2 = '';
    var whichCode = getChar(e);
    if (whichCode == 13)
        return false;
    if (whichCode == 9)
        return true;

    if (whichCode == 8 || whichCode == 46)
        objTextBox.value = objTextBox.value.substr(0, objTextBox.value.length - 1);
    else
        key = String.fromCharCode(whichCode); // Valor para o código da Chave

    if (whichCode == 190)
        key = ".";
    
    if (whichCode == 220)
        key = separadorDecimal;
    
    if (strCheck.indexOf(key) == -1 && key != separadorDecimal && sinais.indexOf(key) == -1 && !(whichCode == 8 || whichCode == 46))
        return false; // Chave inválida

    var sinal = '';

    var campo = objTextBox.value.charAt(0);
    if (obrigatorio) {
        if (campo === '' || sinais.indexOf(campo) == -1)
            sinal = sinais.charAt(0);
        else
            sinal = campo;
    } else {
        if (campo !== '' &&...