Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá Pessoa,
Uso a função abaixo para formatar moeda.. Funciona legal.
Porem em inputs com atributo readonly... Ela pemite alteração.
Estou tentando bloquea-la pelo atribuito... Mais não tá rolando...
Segue função:
//===================================
//MÁSCARA DE MOEDA
//onkeypress='reais(this,event)' onkeydown="backspace(this,event)'
documentall = document.all;
function formatamoney(c) {
var t = this; if(c == undefined) c = 2;
var p, d = (t=t.split("."))[1].substr(0, c);
for(p = (t=t[0]).length; (p-=3) >= 1;) {
t = t.substr(0,p) + "." + t.substr(p);
}
return t+","+d+Array(c+1-d.length).join(0);
}
String.prototype.formatCurrency=formatamoney
function demaskvalue(valor, currency){
var val2 = '';
var strCheck = '0123456789';
var len = valor.length;
if (len== 0){
return 0.00;
}
if (currency ==true){
for(var i = 0; i < len; i++)
if ((valor.charAt(i) != '0') && (valor.charAt(i) != ',')) break;
for(; i < len; i++){
if (strCheck.indexOf(valor.charAt(i))!=-1) val2+= valor.charAt(i);
}
if(val2.length==0) return "0.00";
if (val2.length==1)return "0.0" + val2;
if (val2.length==2)return "0." + val2;
var parte1 = val2.substring(0,val2.length-2);
var parte2 = val2.substring(val2.length-2);
var returnvalue = parte1 + "." + parte2;
return returnvalue;
}
else{
val3 ="";
for(var k=0; k < len; k++){
if (strCheck.indexOf(valor.charAt(k))!=-1) val3+= valor.charAt(k);
}
return val3;
}
}
function reais(obj,event){
var whichCode = (window.Event) ? event.which : event.keyCode;
if (whichCode == 8 && !documentall) {
if (event.preventDefault){ //standart browsers
event.preventDefault();
}else{ // internet explorer
event.returnValue = false;
}
var valor = obj.value;
var x = valor.substring(0,valor.length-1);
obj.value= demaskvalue(x,true).formatCurrency();
return false;
}
FormataReais(obj,'.',',',event);function backspace(obj,event){
var whichCode = (window.Event) ? event.which : event.keyCode;
if (whichCode == 8 && documentall) {
var valor = obj.value;
var x = valor.substring(0,valor.length-1);
var y = demaskvalue(x,true).formatCurrency();
obj.value ="";
obj.value += y;
if (event.preventDefault){
event.preventDefault();
}else{ // internet explorer
event.returnValue = false;
}
return false;
}// end if
}// end backspace
function FormataReais(fld, milSep, decSep, e) {
var sep = 0;
var key = '';
var i = j = 0;
var len = len2 = 0;
var strCheck = '0123456789';
var aux = aux2 = '';
var whichCode = (window.Event) ? e.which : e.keyCode;
/
if (whichCode == 0 ) return true;
if (whichCode == 9 ) return true; //tecla tab
if (whichCode == 13) return true; //tecla enter
if (whichCode == 16) return true; //shift internet explorer
if (whichCode == 17) return true; //control no internet explorer
if (whichCode == 27 ) return true; //tecla esc
if (whichCode == 34 ) return true; //tecla end
if (whichCode == 35 ) return true; //tecla end
if (whichCode == 36 ) return true; //tecla home
if (e.preventDefault){
e.preventDefault()
}else{ // internet explorer
e.returnValue = false
}
var key = String.fromCharCode(whichCode);
if (strCheck.indexOf(key) == -1) return false;
fld.value += key;
var len = fld.value.length;
var bodeaux = demaskvalue(fld.value,true).formatCurrency();
fld.value=bodeaux;
if (fld.createTextRange) {
var range = fld.createTextRange();
range.collapse(false);
range.select();
}
else if (fld.setSelectionRange) {
fld.focus();
var length = fld.value.length;
fld.setSelectionRange(length, length);
}
return false;
}
//==========================================
Tipo algo assim:
for(var i = 0; i < obj.attributes.length; i++){
if(obj.attributes[i].specified)
if(obj.attributes[i].readonly=="true"){ ///
obj.attributes[i].alt=="bloq"
return false;
}
}
Mas tb não bloqueia... Agradeço qualuer ajuda.
Willian, Obrigado por responder....
Eu já havia localizado sua função. Mas não consegui implementar para moeda.
Em um input vazio... Ao digitar, ela não coloca o ponto e a virgula automaticamente como a que estou usado...
E se coloco (digito) a virgula ele aceita mais de um virgula... Onde posso estar errando em relação a implementação da sua função.
Não tem mesmo como bloquer via atributo??
o atributo bloqueia, mas a tua função é problemática, e ignora ele.
use a minha.
William,
Cara não manjo muito de ER... Testei sua função para moeda.
Não formatou corretamente. Passa + de uma virgula, passa + de um ponto e não impede mais de 2 zeros no final.
Teste e verá.
vc ta usando errado cara.. veja:
<script type="text/javascript">
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>
<input type="text" onkeypress="mascara(this, mvalor);" maxlength="12" />ele não aceita vc digitar virgula não.. formata certinho:[http://postimage.org/image/dslwgbqw7/](http://postimage.org/image/dslwgbqw7/)
E se tivesse o readonly:
<input type="text" onkeypress="mascara(this, mvalor);" value="1.231,23" maxlength="12" readonly="readonly" />vc não consegue editar.
Blz William,
Agora "funfou"... Só identiquei , a princíopo... de diferente aspas simple de aspas duplas em relação ao seu exemplo.
Obrigado mesmo.
PS. Se deseja da uma forcinha na questão do selects... http://forum.imasters.com.br/topic/489512-validao-da-seleo-de-checkboxs/
Tb agradeço
Abraço
William, me ajuda!?
Disse que funcionava sua solução da mascara... Mas não havia pecebido que no I.E..
*se usamos ** "backspace" o ponto e virgula não acompanha. zoando uma somatório por exemplo. *
Como tratar "event.keyCode " com ER ???
qual ie vc tá usando ?
e pq vc ta trabalhando com keyCode ? no meu código não é necessário.
Olá Wiliam,
O IE... versão 8.0...
No Firefox... Ok certinho versão 16
No chrome... Tb falha no backspace versçao 25
Não estou usando keyCode... O Código está igualzinho ao que você recomendou... Falei porque é o que é geralmente utilizando para pegar a tecla...
no ie o objeto event é global, e no chrome ou firefox, o event é argumento da função.
juro que não consegui reproduzir essa falha. Aqui tá redondinho no chrome e ie.
Willian,
Ainda sobre a sua função... E o problema das casas decimais com 2 digitos antes da virgula no backspace.
Pesquisei por aí sobre o backspace...
Me parece que para o backspace funcionar... Deve utilizar um comando especial... [^]
O problema é que não manjo tanto de ER..... O comando deve ser colocado no início da cadeia...
Onde começa a cadeia na sua função?
Veja fontes de referencias:
http://www.codeproject.com/Questions/113758/Regular-Expression-for-alphanumeric-and-backspace
http://stackoverflow.com/questions/7226402/help-with-regex-pattern-for-delete-arrows-and-escape-keys
http://regexlib.com/CheatSheet.aspx?AspxAutoDetectCookieSupport=1
Abraço
JGD
Ainda sobre a sua função... E o problema das casas decimais com 2 digitos antes da virgula no backspace.
explica novamente por favor, qual o problema ?
Mesmo testando, não consegui encontrar nenhum erro. Oque acontece ?
Qual o comportamento para que dê algo errado ?
No imput vazio
O caracter pipe("|") represta o cursor...
No imput com valor igual: 1.000,00.
Se colocar o cursor no final (1.000,00"|")
Se colocar o cursor no final ( 100,00"|")
Se colocar o cursor no final ( 10,00"|")
a)E deletar 1 item: o resultado no campo é: 1.000,0 // Qdo deveria ser 100,00
b)E deletar 2 itens: o resultado no campo é: 1.000, // Qdo deveria ser 10,00
Para backspace:
Se colocar o cursor no meio do valor (1.00"|"0,00) ou no inicio ("|"1.000,00) // mesma situação ele deveria formar
Ele não re-format as casas descimnais como na ida. (1ª insersão.
Tem como forçar o cursor para sempre iniciar no final do imput (right)... Creio que isso já ajudaria na função..
eu uso isso aqui: 10 vezes menos codigo, e não tem bugs
http://wbruno.com.br/2011/03/12/diversas-mascaras-com-er/