Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Djonatan Buss

Formatador de moeda

Recommended Posts

Pessoal, peguei uma função que ja estava em um sistema que herdei mas que não era muito dinâmica.

Já vi umas semelhantes mas nenhuma me agradava completamente. Editei e to postando o resultado

 

function Formata_reais(campo,tammax,teclapres,decimal) {
    var tecla = teclapres.keyCode;
    vr = Limpar(campo.value,"0123456789");
    tam = vr.length;
    dec=decimal;

    if (tam < tammax && tecla != 8){
        tam = vr.length + 1 ;
    }
    if (tecla == 8 ){
        tam = tam - 1 ;
    }
    if ( tecla == 8 || tecla >= 48 && tecla <= 57 || tecla >= 96 && tecla <= 105 )
    {
        if ( tam <= dec ){
            fill = (dec - 1);
            i = "";
            while (fill > 0){
                i += "0";
                fill--;
            }
            campo.value = "0," + i + vr ;//0,001-1
        }
        if ( (tam > dec) && (tam <= (dec + 3)) ){//1,123 - 123,456
            if (vr.substr( 0, tam - dec )== "00" || vr.substr( 0, tam - dec )=="000"){
                campo.value = "0," + vr.substr( tam - dec, tam ) ;
            } else if (vr.substr( 0, 1)==0) { //0,12345
                campo.value = vr.substr( 1, tam - (dec+1) ) + "," + vr.substr( tam - dec, tam ) ;
            } else {
                campo.value = vr.substr( 0, tam - dec ) + "," + vr.substr( tam - dec, tam ) ;
            }

        }
        if ( (tam >= (dec + 4)) && (tam <= (dec + 6) ) ){//3.456,789 - 123.456,789
            campo.value = vr.substr( 0, tam - (dec + 3) ) + "." + vr.substr( tam - (dec + 3), 3 ) + "," + vr.substr( tam - dec, tam ) ;
        }
        if ( (tam >= (dec + 7)) && (tam <= (dec + 9)) ){//1.234.567,891 - 123.456.789,123
            campo.value = vr.substr( 0, tam - (dec + 6) ) + "." + vr.substr( tam - (dec + 6), 3 ) + "." + vr.substr( tam - (dec + 3), 3 ) + "," + vr.substr( tam - dec, tam ) ;
        }
        if ( (tam >= (dec + 10)) && (tam <= (dec + 12)) ){//0.123.456.789,123 - 000.123.456.789,123
            campo.value = vr.substr( 0, tam - (dec + 9) ) + "." + vr.substr(tam - (dec + 9), 3 ) + "." + vr.substr( tam - (dec + 6), 3 ) + "." + vr.substr( tam - (dec + 3), 3 ) + "," + vr.substr( tam - dec, tam ) ;
        }
        if ( (tam >= (dec + 13)) && (tam <= (dec + 15)) ){
            campo.value = vr.substr(0, tam - (dec + 12)) + "." + vr.substr(tam - (dec + 12) , 3 ) + "." + vr.substr(tam - (dec + 9), 3 ) + "." + vr.substr( tam - (dec + 6), 3 ) + "." + vr.substr( tam - (dec + 3), 3 ) + "," + vr.substr( tam - dec, tam ) ;
        }
    }
}
Todo if segue uma mesma lógica ( os dois primeiros tem um tratamento diferenciado ), então se alguém achar útil automatizar dentro de um loop isso sinta-se a vontade.

Não sei de quem é o crédito da função original.

Ta formatando até yyy.xxx.yyy.xxx,yyy

 

A função Limpar vai limpando as entradas de acordo com os caracteres permitidos.

Sou inexperiente com javascript, então sintam-se a vontade pra me chamar a atenção sobre erros e problemas de performance.

function Limpar(valor, validos)
{
    // retira caracteres invalidos da string
    var result = "";
    var aux;
    for (var i=0; i < valor.length; i++)
    {
        aux = validos.indexOf(valor.substring(i, i+1));
        if (aux>=0)
        {
            result += aux;
        }
    }
    return result;
}

A chamada fica assim.

 

<input name='valor' type='text' size='20' maxlength='19' onkeydown="Formata_reais(this,20,event,4)">
onde 4 é o número de casas depois da vírgula

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara.. posta um exemplo de uso.

 

mas sei lá, dá uma olhada nessa:

<html>
<head>
<script type="text/javascript">
/* Máscaras ER */
function mascara(o,f){
    v_obj=o
    v_fun=f
    setTimeout("execmascara()",1)
}
function execmascara(){
    v_obj.value=v_fun(v_obj.value)
}
function mvalor(v){
    v=v.replace(/\D/g,"");//Remove tudo o que não é dígito
    v=v.replace(/(\d)(\d{8})$/,"$1.$2");//coloca o ponto dos milhões
    v=v.replace(/(\d)(\d{5})$/,"$1.$2");//coloca o ponto dos milhares
        
    v=v.replace(/(\d)(\d{2})$/,"$1,$2");//coloca a virgula antes dos 2 últimos dígitos
    return v;
}
</script>
<style type="text/css">
label { display: block; }
</style>
</head>
<body>
	<form action="" method="post">
		<label>Real: <input type="text" name="valor" onkeypress="mascara( this, mvalor );" maxlength="14" /></label>
	</form>
</body>
</html>

http://code.imasters.com.br/index.php?/topic/109-mascaras-enquanto-digita-er/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi direito tua função mas parece que é fixo o número de digitos depois da vírgula.

O meu interesse era ter isso de forma dinâmica, além disso a minha digita da direita pra esquerda, demonstrando quantos números preciso depois da vírgula.

Meu caso é semelhante com valor de combustível onde usamos 3 ou 4 casas depois da vírgula.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.