Ir para conteúdo

POWERED BY:

Arquivado

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

Remazela

[Resolvido] PHP - Erro com multiplicação de campos

Recommended Posts

Caros amigos.

 

Tenho 2 campos: 

qtde ===> campo inteiro

vrUnit ==> campo moeda

 

Preciso fazer a multiplicação na tela, para mostrar ao usuário.

 

Estou com o seguinte código:

   
    function calcular(){
        var valor1 = parseInt(document.getElementById('qtde').value, 10);
        var valor2 = parseInt(document.getElementById('vrUnit').value, 10);  
        document.getElementById('vrTotal').value = valor1 * valor2;
    }

O código acima faz a multiplicação. O que não acontece que preciso, seria formatar o campo vrUnit, para máscara moeda.

Utilizei o código abaixo:

//Valida os campos moeda do formulário 
  function dinheiro(cur,len) {
     n='__0123456789';
     d=cur.value;
     l=d.length;
     r='';

     if (l > 0){
        z=d.substr(0,l-1);
        s='';
        a=2;

          for (i=0; i < l; i++){
              c=d.charAt(i);
              if (n.indexOf(c) > a){
                  a=1;
                  s+=c;
              };
          };


          l=s.length;
          t=len-1;
          if (l > t){
              l=t;
              s=s.substr(0,t);
          };


          if (l > 2){
              r=s.substr(0,l-2)+','+s.substr(l-2,2);
          } else {
              if (l == 2){
                  r='0,'+s;
              } else  {
                  if (l == 1){
                      r='0,0'+s;
                  };
              };
          };


          if (r=='0,00'){
             return false;             
          } else {
              l=r.length;
              if (l > 6){
                  j=l%3;
                  w=r.substr(0,j);
                  wa=r.substr(j,l-j-6);
                  wb=r.substr(l-6,6);
                  if (j > 0){
                      w+='.';
                  };

                  k=(l-j)/3-2;
                  for (i=0; i < k; i++){
                      w+=wa.substr(i*3,3)+'.';
                  };
                  r=w+wb;
              };
          };

     };

     if (r.length <= len){
      cur.value=r;
     } else {
      cur.value=z;
     };

     return 'ok';

  };  

    
      function id(el) {
        return document.getElementById( el );
      }
      function total( qtde, vrUnit ) {
        return parseFloat(qtde.replace(',', '.'), 10) * parseFloat(vrUnit.replace(',', '.'), 10);
      }
    
      window.onload = function() {
        id('vrUnit').addEventListener('keyup', function() {
        var result = total( this.value , id('qtde').value );
        id('vrTotal').value = String(result.toFixed(2)).formatMoney();
        });

        id('qtde').addEventListener('keyup', function(){
        var result = total( id('vrTotal').value , this.value );
        id('vrTotal').value = String(result.toFixed(2)).formatMoney();
        });
      }

      String.prototype.formatMoney = function() {
        var v = this;

        if(v.indexOf('.') === -1) {
           v = v.replace(/([\d]+)/, "$1,00");
        }

        v = v.replace(/([\d]+)\.([\d]{1})$/, "$1,$20");
        v = v.replace(/([\d]+)\.([\d]{2})$/, "$1,$2");
        v = v.replace(/([\d]+)([\d]{3}),([\d]{2})$/, "$1.$2,$3");

        return v;
      };   

Até faz a multiplicação, mas quando digito o valor: 1.234.567,89,  com o código acima após digitar o valor unitário,  apenas mostra: 123,60.

 

Não entendo o porque.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caros amigos.

 

Consegui resolver da seguinte forma:

 

No INPUT, ficou assim:

                    <div class="col-sm-2 invoice-col">
                      <label for="vrUnit">Valor Unitário</label>
                      <input type="text" id='vrUnit' name="vrUnit" size="12" class="form-control" maxlength="12" 
                             onkeypress="return(currencyFormat(this,'',',',event))" 
                             style="width:110%; font-size:14px; text-align:right;" >
                    </div>  

No INPUT chamo a função:  onkeypress="return(currencyFormat(this,'',',',event))"

 

 

 

Depois o SCRIPT, ficou assim:

<!--Script para Validar o Formulário -->
<script language="JavaScript" >

function currencyFormat(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 == 13) return true;  // Enter
  key = String.fromCharCode(whichCode);  // Get key value from key code
  
  if (strCheck.indexOf(key) == -1) return false;  // Not a valid key
  len = fld.value.length;
  
  for(i = 0; i < len; i++)
  if ((fld.value.charAt(i) != '0') && (fld.value.charAt(i) != decSep)) break;
  
  aux = '';
  for(; i < len; i++)
  if (strCheck.indexOf(fld.value.charAt(i))!=-1) aux += fld.value.charAt(i);
  aux += key;
  len = aux.length;
  
  if (len == 0) fld.value = '';
  if (len == 1) fld.value = '0'+ decSep + '0' + aux;
  if (len == 2) fld.value = '0'+ decSep + aux;
  if (len > 2) {
    aux2 = '';
    for (j = 0, i = len - 3; i >= 0; i--) {
    if (j == 3) {
    aux2 += milSep;
    j = 0;
    }
    aux2 += aux.charAt(i);
    j++;
    }
    fld.value = '';
    len2 = aux2.length;
    for (i = len2 - 1; i >= 0; i--)
    fld.value += aux2.charAt(i);
    fld.value += decSep + aux.substr(len - 2, len);
  }
  return false;
}

function id(el) {
  return document.getElementById( el );
}
function total( un, qtde ) {
  return parseFloat(un.replace(',', '.'), 10) * parseFloat(qtde.replace(',', '.'), 10);
}
window.onload = function() {
  id('vrUnit').addEventListener('keyup', function() {
    var result = total( this.value , id('qtde').value );
    id('vrTotal').value = String(result.toFixed(2)).formatMoney();
  });

  id('qtde').addEventListener('keyup', function(){
    var result = total( id('vrUnit').value , this.value );
    id('vrTotal').value = String(result.toFixed(2)).formatMoney();
  });
}

String.prototype.formatMoney = function() {
  var v = this;

  if(v.indexOf('.') === -1) {
    v = v.replace(/([\d]+)/, "$1,00");
  }

  v = v.replace(/([\d]+)\.([\d]{1})$/, "$1,$20");
  v = v.replace(/([\d]+)\.([\d]{2})$/, "$1,$2");
  v = v.replace(/([\d]+)([\d]{3}),([\d]{2})$/, "$1.$2,$3");

  return v;
};

</script>    

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

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