Ir para conteúdo
violin101

PHP - Passar valor para o INPUT vindo do AJAX em formato moeda

Recommended Posts

Caros amigos, saudações.

 

Tem como passar para o Formulário um Campo vindo via AJAX no formato moeda ?

 

Tenho uma rotina onde o usuário escolhe através de uma Lista na modal de Produtos e o sistema informa o formulário os seguintes campos:
código | descrição | espécie | estoque atual.

 

o estoque atual preciso passar nesse formato, para validação de quantidade: 15.00 ou 15,00.

ou seja:

converter de: 15 

para: 15.00 com casas decimais

tem como fazer isso ?

 

Grato,

 

Cesar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem funções nativas tanto em PHP quanto em JavaScript que podem ajudar na formatação de números para moeda.
Vou listar algumas das funções mais úteis para esse propósito em ambas as linguagens.

PHP

// 1. number_format()
$numero = 1234.56;
echo number_format($numero, 2, ',', '.'); // Saída: 1.234,56

// 2. money_format() (Obsoleta a partir do PHP 7.4)
// Nota: Esta função foi removida no PHP 8.0
setlocale(LC_MONETARY, 'pt_BR');
$numero = 1234.56;
echo money_format('%.2n', $numero); // Saída: R$ 1.234,56

// 3. NumberFormatter (intl extension)
$formatter = new NumberFormatter('pt_BR', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency(1234.56, 'BRL'); // Saída: R$ 1.234,56

// 4. str_replace() (para substituir ponto por vírgula)
$numero = 1234.56;
echo str_replace('.', ',', number_format($numero, 2)); // Saída: 1234,56

JS

// 1. toFixed()
let numero = 1234.56;
console.log(numero.toFixed(2)); // Saída: "1234.56"

// 2. toLocaleString()
let numero = 1234.56;
console.log(numero.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' }));
// Saída: "R$ 1.234,56"

// 3. Intl.NumberFormat
let formatter = new Intl.NumberFormat('pt-BR', {
    style: 'currency',
    currency: 'BRL',
});
console.log(formatter.format(1234.56)); // Saída: "R$ 1.234,56"

// 4. replace() (para substituir ponto por vírgula)
let numero = 1234.56;
console.log(numero.toFixed(2).replace('.', ',')); // Saída: "1234,56"

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Williams, saudações.

Obrigado pela a dica acima.

 

Estou com o seguinte problema.

Quando salvo as entrada de produtos no MySql, salvo a quantidade neste formato: 123.45  <== usando ponto

O problema é quando vou fazer o consumo, preciso fazer uma validação para não digitar acima do estoque real, ou seja, 123.45.

 

o erro que estou encontrando é:
estoque real: 123.45

consumo.....: 2.00   <== aqui dá erro, pois o sistema entende que 2 é maior que 123.45

 

o JS me traz as informações correta do BD é somente nessa validação que não estou entendendo este erro.

 

Observação: para nesse caso preciso salvar a quantidade no formato BRASILEIRO, pois alguns produtos utiliza quantidade após a virgula ou ponto.

 

o form está assim:


<div class="col-md-2">
     <div class="form-group">
           <label for="">Estoque Atual</label>
            <input type="text" class="form-control" id="estoque_atual" name="estoque_atual"
                   style="font-size:15px; font-weight:bold; width:100%; text-align:center;"
                    disabled > 
      </div>
</div> 

<!--A modal carrega os Dados do MySql para selecionar o produto. -->
<div class="modal fade" id="modal_prod">
  <div class="modal-dialog modal-xl">
    <div class="modal-content">

      <div class="modal-header" style="font-size:18px; color:#ffffff; background:#307192;">
         <h4 class="modal-title"><strong>Lista do(s) Produto(s) por Departamento(s)</strong></h4>
      </div>

      <div class="modal-body">
        <table id="tab_prod" class="table table-bordered table-hover">
          <thead>
            <tr>
              <th style="text-align:center;">Cód. Interno</th>
              <th style="text-align:center;">Descrição</th>
              <th style="text-align:center;">ESP</th>
              <th style="text-align:center;">QTDE</th>
              <th style="text-align:center;">Ação</th>
            </tr>
          </thead>
          <tbody>
          
          <?php foreach ($lanca as $lnc) {
            //Variável criada para carregar informação dos Dados para o Botão
            $datalnc = $lnc->idProdutos."*".$lnc->cod_interno."*".$lnc->descricao."*".$lnc->prd_unid."*".$lnc->estoque_atual;                   
            echo '<tr>';
              echo '<td width="20" height="10" style="text-align:center;">'.$lnc->idProdutos.'</td>';
              echo '<td width="250" height="10" style="text-align:left;">'.$lnc->descricao.'</td>';
              echo '<td width="20" height="10" style="text-align:center;">'.$lnc->prd_unid.'</td>';
              echo '<td width="20" height="10" style="text-align:center;">'.number_format($lnc->estoque_atual, 2, ",", ".").'</td>'; 

                echo '<td width="20" style="text-align:center;">            
                        <button type="button" class="btn btn-success btn-prod" 
                          style="margin-right: 2%; padding: 2px 3px;" title="Selecionar Produto"
                          value="'. $datalnc.'" >
                          <span class="fa fa-check"></span>
                        </button></td>';
                            
            echo '</tr>';
                  
            }//Fim do Foreach  ?>
          
          </tbody>
        </table>
      </div>

      <div class="modal-footer justify-content-center" style="background:#BBAAAA;">
        <button type="button" class="btn btn-danger pull-center" data-dismiss="modal">Voltar</button>
      </div>

    </div><!-- /.modal-content -->
  </div><!-- /.modal-dialog -->
</div>

 

 

o JAVASCRIPT, trago assim:


          /*---Função para Capturar o Produto selecionado na Modal---*/
          $(document).on("click",".btn-prod",function(){
            prds = $(this).val();
            infoprd = prds.split("*");
              $("#idProdutos").val(infoprd[0]);
              $("#cod_interno").val(infoprd[1]);
              $("#descricao").val(infoprd[2]);
              $("#prd_unid").val(infoprd[3]);            
              $("#estoque_atual").val(infoprd[4]);  //Campo com os dados do ESTOQUE, ou seja, quantidade: 123.45
              $("#modal_prod").modal("hide");

              //Função para Atualizar o Status do Botão
              statusLimparAgregar()
          });

 

Grato,

 

Cesar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caros amigos, saudações.

 

Após algumas pesquisas e orientação do grupo, consegui fazer a validação de QtdeDigitada X QtdeEstoque,.

 

Observação: não sei se é a forma mais correta, mas atendeu o que preciso.

 

Ficou assim:

          /*---Função para Capturar o Produto selecionado na Modal---*/
          $(document).on("click",".btn-prod",function(){
            prds = $(this).val();
            infoprd = prds.split("*");
              $("#idProdutos").val(infoprd[0]);
              $("#cod_interno").val(infoprd[1]);
              $("#descricao").val(infoprd[2]);
              $("#prd_unid").val(infoprd[3]);            
              $("#estoque_atual").val(infoprd[4]);  
              $("#modal_prod").modal("hide");

              //Função para Atualizar o Status do Botão
              statusLimparAgregar()
          });
 
          $("#btn-agregar").on("click",function(){   
            var qtde = document.getElementById("qtde").value;     

            //Verifica Duplicidade de Código
            if (verificar(infoprd[0])) {
              //Chama a Modal com Alerta.
              $("#modal_mensagem").modal();
            }else if(verificarEstoque(infoprd[4])){           
              //Chama a Modal com Alerta.
              $("#modal_qtdemaior").modal();
            }else{                           
               if(qtde == ""){
                //Chama a Modal com Alerta.
                $("#modal_quantidade").modal();
               } else {
                 html = "<tr>";
                 html += "<td width='10%' height='10' style='text-align:center;'><input type='hidden' name='id_prds[]' value='"+infoprd[0]+"'>"+infoprd[0]+"</td>";
                 html += "<td width='32%' height='10'><input type='hidden' name='descricao[]' value='"+infoprd[2]+"'>"+infoprd[2]+"</td>";
                 html += "<td width='10%' height='10' style='text-align:center;'>"+
                         "<input type='hidden' name='esp[]' value='"+infoprd[3]+"'>"+infoprd[3]+
                         "<input type='hidden' name='estoq[]' value='"+infoprd[4]+"'></td>";
                 html += "<td width='12%' height='10' style='text-align:center;'><input type='hidden' name='qtde[]' value='"+qtde+"'>"+qtde+"</td>";                
                 html += "<td width='10%' height='10' style='text-align:center;'>"+
                          "<button type='button' class='btn btn-danger btn-remove-produto' style='margin-right: 1%; padding: 1px 2px;' title='Remover Item da Lista'>"+
                          "<span class='fa fa-trash'></span></button></td>";                       
                 html += "</tr>";

                $("#tbventas tbody").append(html);

                //Função para Somar os Itens do Lançamento
                somar();     

                $("#btn-agregar").val(null);
                $("#descricao").val(null);
                $("#cod_interno").val(null);    
                $("#prd_unid").val(null);            
                $("#estoque_atual").val(null);
                $("#qtde").val(null);

                //Desabilita Buttons
                document.getElementById("btn-limp").disabled = true;                                     
                document.getElementById("btn-agregar").disabled = true;     

              }//Fim do IF-qtde      

            }//Fim do IF-verificar
              
          });//Fim da Função btn-agregar      
          
      });


      /* Remover ITEM da Lista de Produtos */
      $(document).on("click",".btn-remove-produto", function(){
          $(this).closest("tr").remove();   

          //Função para Somar os Itens do Lançamento
          somar();  

          //Função para Atualizar o Status do Botão  
          statusButton();  

      });  


      //Função para Impedir Duplicidade de Produtos
      function verificar(idProdutos){
          var existe = 0;
          $('input[name^="id_prds"]').each(function() {
              if ($(this).val() == idProdutos) {
                  existe = 1;
              }
          });
          return existe;
      }      


      //Função para Impedir Quantidade maior que do Estoque
      function verificarEstoque(){

        //Variável para retonar o resultado
        var exists = 0;

        //Variáveis recebe o valor do Formulário
        var qts = document.getElementById('qtde').value;
        var stq = document.getElementById('estoque_atual').value;

        // Substitui vírgula por ponto, remove caracteres não numéricos e converte para float
        valorQtde = parseFloat(qts.replace(/[^\d,-]/g, '').replace(',', '.'));        
        valorEstq = parseFloat(stq.replace(/[^\d,-]/g, '').replace(',', '.'));

        if(valorQtde > valorEstq){
          exists = 1;
          //Limpa Inputs e Button
          $("#btn-agregar").val(null);
          $("#descricao").val(null);
          $("#cod_interno").val(null);    
          $("#prd_unid").val(null);            
          $("#estoque_atual").val(null);
          $("#qtde").val(null);
        }
        return exists;
      }      



 

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 horas atrás, violin101 disse:

Amigo Williams, saudações.

Obrigado pela a dica acima.

 

Estou com o seguinte problema.

Quando salvo as entrada de produtos no MySql, salvo a quantidade neste formato: 123.45  <== usando ponto

O problema é quando vou fazer o consumo, preciso fazer uma validação para não digitar acima do estoque real, ou seja, 123.45.

 

o erro que estou encontrando é:
estoque real: 123.45

consumo.....: 2.00   <== aqui dá erro, pois o sistema entende que 2 é maior que 123.45

 

o JS me traz as informações correta do BD é somente nessa validação que não estou entendendo este erro.

 

Observação: para nesse caso preciso salvar a quantidade no formato BRASILEIRO, pois alguns produtos utiliza quantidade após a virgula ou ponto.

 

o form está assim:



<div class="col-md-2">
     <div class="form-group">
           <label for="">Estoque Atual</label>
            <input type="text" class="form-control" id="estoque_atual" name="estoque_atual"
                   style="font-size:15px; font-weight:bold; width:100%; text-align:center;"
                    disabled > 
      </div>
</div> 

<!--A modal carrega os Dados do MySql para selecionar o produto. -->
<div class="modal fade" id="modal_prod">
  <div class="modal-dialog modal-xl">
    <div class="modal-content">

      <div class="modal-header" style="font-size:18px; color:#ffffff; background:#307192;">
         <h4 class="modal-title"><strong>Lista do(s) Produto(s) por Departamento(s)</strong></h4>
      </div>

      <div class="modal-body">
        <table id="tab_prod" class="table table-bordered table-hover">
          <thead>
            <tr>
              <th style="text-align:center;">Cód. Interno</th>
              <th style="text-align:center;">Descrição</th>
              <th style="text-align:center;">ESP</th>
              <th style="text-align:center;">QTDE</th>
              <th style="text-align:center;">Ação</th>
            </tr>
          </thead>
          <tbody>
          
          <?php foreach ($lanca as $lnc) {
            //Variável criada para carregar informação dos Dados para o Botão
            $datalnc = $lnc->idProdutos."*".$lnc->cod_interno."*".$lnc->descricao."*".$lnc->prd_unid."*".$lnc->estoque_atual;                   
            echo '<tr>';
              echo '<td width="20" height="10" style="text-align:center;">'.$lnc->idProdutos.'</td>';
              echo '<td width="250" height="10" style="text-align:left;">'.$lnc->descricao.'</td>';
              echo '<td width="20" height="10" style="text-align:center;">'.$lnc->prd_unid.'</td>';
              echo '<td width="20" height="10" style="text-align:center;">'.number_format($lnc->estoque_atual, 2, ",", ".").'</td>'; 

                echo '<td width="20" style="text-align:center;">            
                        <button type="button" class="btn btn-success btn-prod" 
                          style="margin-right: 2%; padding: 2px 3px;" title="Selecionar Produto"
                          value="'. $datalnc.'" >
                          <span class="fa fa-check"></span>
                        </button></td>';
                            
            echo '</tr>';
                  
            }//Fim do Foreach  ?>
          
          </tbody>
        </table>
      </div>

      <div class="modal-footer justify-content-center" style="background:#BBAAAA;">
        <button type="button" class="btn btn-danger pull-center" data-dismiss="modal">Voltar</button>
      </div>

    </div><!-- /.modal-content -->
  </div><!-- /.modal-dialog -->
</div>

 

 

o JAVASCRIPT, trago assim:



          /*---Função para Capturar o Produto selecionado na Modal---*/
          $(document).on("click",".btn-prod",function(){
            prds = $(this).val();
            infoprd = prds.split("*");
              $("#idProdutos").val(infoprd[0]);
              $("#cod_interno").val(infoprd[1]);
              $("#descricao").val(infoprd[2]);
              $("#prd_unid").val(infoprd[3]);            
              $("#estoque_atual").val(infoprd[4]);  //Campo com os dados do ESTOQUE, ou seja, quantidade: 123.45
              $("#modal_prod").modal("hide");

              //Função para Atualizar o Status do Botão
              statusLimparAgregar()
          });

 

Grato,

 

Cesar


Explicando:

O erro ocorre porque você está comparando strings em vez de números, e na comparação de strings, "2.00" é considerado maior que "123.45" (porque a comparação é feita caractere por caractere, e "2" vem depois de "1" alfabeticamente).


Para resolver este problema, precisa garantir que está trabalhando com números em vez de strings, e que esta usando o formato correto para comparação. Vou sugerir uma solução que mantém o formato brasileiro para exibição, mas usa o formato com ponto para cálculos internos.

// Função para formatar número para o formato brasileiro
function formatarNumero(numero) {
    return numero.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}

// Função para converter string no formato brasileiro para número
function converterParaNumero(str) {
    return parseFloat(str.replace('.', '').replace(',', '.'));
}

// Modifique a função existente
$(document).on("click", ".btn-prod", function() {
    prds = $(this).val();
    infoprd = prds.split("*");
    $("#idProdutos").val(infoprd[0]);
    $("#cod_interno").val(infoprd[1]);
    $("#descricao").val(infoprd[2]);
    $("#prd_unid").val(infoprd[3]);
    
    // Armazena o valor numérico em um atributo data-
    var estoqueNumerico = parseFloat(infoprd[4]);
    $("#estoque_atual").val(formatarNumero(estoqueNumerico))
                       .data('valor-numerico', estoqueNumerico);
    
    $("#modal_prod").modal("hide");

    statusLimparAgregar();
});

// Função para validar o consumo
function validarConsumo() {
    var estoqueAtual = $("#estoque_atual").data('valor-numerico');
    var consumo = converterParaNumero($("#campo_consumo").val());

    if (consumo > estoqueAtual) {
        alert("O consumo não pode ser maior que o estoque atual.");
        return false;
    }
    return true;
}

// Adicione este evento ao campo de consumo
$("#campo_consumo").on('blur', function() {
    $(this).val(formatarNumero(converterParaNumero($(this).val())));
});

// Use esta função no submit do formulário
$("form").on('submit', function(e) {
    if (!validarConsumo()) {
        e.preventDefault(); // Impede o envio do formulário se a validação falhar
    }
});

Explicação das modificações:

  1. formatarNumero(): Formata um número para o estilo brasileiro (123,45).
  2. converterParaNumero(): Converte uma string no formato brasileiro para um número.
  3. Na função de click do produto, armazenamos o valor numérico do estoque em um atributo data- e exibir o valor formatado no campo.
  4. validarConsumo(): Compara o consumo com o estoque atual, ambos como números.
  5. Adicionado um evento blur ao campo de consumo para formatá-lo automaticamente.
  6. Adicionado uma validação no submit do formulário.

Com essas modificações, você pode:

  1. Exibir os números no formato brasileiro (123,45).
  2. Armazenar internamente os valores como números para comparações corretas.
  3. Validar se o consumo é maior que o estoque atual.

Lembre-se de ajustar os IDs dos campos (#campo_consumo, por exemplo) para corresponder aos seus IDs reais no HTML.

Além disso, no PHP, quando for salvar os dados no banco de dados, você precisará converter o valor de volta para o formato com ponto:
 

$consumo = str_replace(',', '.', $_POST['campo_consumo']);

Isso garantirá que o valor seja salvo corretamente no MySQL.

Esta abordagem deve resolver o problema de comparação, mantendo a exibição no formato brasileiro e permitindo cálculos e comparações precisas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Williams,  saudações. 

 

Nesse caso o melhor é salvar e configurar o BD como decimal ou valor moeda ?

 

Grato, 

 

Cesar 

Compartilhar este post


Link para o post
Compartilhar em outros sites

double 10,2 para mysql, postgres, float para mongodb etc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • 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
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer ao auxílio dos amigos, mas preciso entender e resolver um problema.
       
      Tenho uma Rotina que o usuário seleciona os produtos que deseja para requerer ao setor responsável.
       
      O usuário escolhe um produto qualquer e Clicla em um button para incluir a lista.

      O problema que estou enfrentando é que após escolher o produto e teclar ENTER o Sistema já salva no BD.
       
      Gostaria de criar uma Tecla de Atalho, para quando incluir/escolher o produto na lista, o usuário tecla como exemplo:
      ALT+A  para agregar a lista
      ALT+S para salvar a lista de itens desejados.

      Assim, quando teclar enter, o sistema não dispara o GRAVAR na Base de Dados.

      Grato,

      Cesar
       
       
       
×

Informação importante

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