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

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.
       
      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.

      tem como fazer isso ?
       
      Grato,
       
      Cesar
    • Por daemon
      Boa tarde,
       
      tenho o domío na raiz: teste.com.br
      Gostaria de criar uma barra /categoria.
       
      No caso fica teste.com.br/categoria/
      Tem como eu fazer este url sem criar a pasta categoria ?
    • Por daemon
      Estou com uma dúvida,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, porém gostara de mostrar a imagem que esta na pagina do link.
       
      É possível eu colocar na minha index o url, e aparecer uma preview da imagem que esta no link ? 
       
      Igual o google: https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGx1YlY4U0JYQjBMVUpTR2dKQ1VpZ0FQAQ?hl=pt-BR&amp;gl=BR&amp;ceid=BR%3Apt-419
       
      No caso eu importo o tópico e descrição, porém não consigo deixar essa imagem na pagina principal.
    • Por violin101
      Caros amigos, saudações.

      Estou com uma dúvida:
      Como consigo fazer uma rotina no sistema onde possa fazer de forma automática trazer o resultado de entrada de produtos a cada 3 meses, por exemplo:

      Produtos --- Entrada ---  Meses
      Prod_A -------- 100 ------ 01/2024
      Prod_A -------- 120 ------ 03/2024
      Prod_A -------- 105 ------ 04/2024
      =========================
      Prod_B -------- 105 ------ 02/2024
      Prod_B -------- 120 ------ 03/2024
      Prod_B -------- 130 ------ 04/2024
      =========================
      ETC
       
      Como consigo mostrar para o usuário esse movimento de entrada a cada 3 meses ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Peço desculpa em recorrer a ajuda dos amigos, pois está sendo um mistério para mim, configurar o meu sistema para Impressão de XML e NFe.

      Quando acrescento as linhas no início do Controller:
      use NFePHP\NFe\Make;
      use NFePHP\NFe\Tools;
      use NFePHP\NFe\Danfe;
      etc, etc.
       
       e chamo a libraries assim em alguma função:  $nfe = new Make(); e etc. <== o sistema acusa que não consegue achar 
       
      fiz as alterações necessárias no autoload
      /* |-------------------------------------------------------------------------- | Composer auto-loading |-------------------------------------------------------------------------- | | Enabling this setting will tell CodeIgniter to look for a Composer | package auto-loader script in application/vendor/autoload.php. | | $config['composer_autoload'] = TRUE; | | Or if you have your vendor/ directory located somewhere else, you | can opt to set a specific path as well: | | $config['composer_autoload'] = '/path/to/vendor/autoload.php'; | | For more information about Composer, please visit http://getcomposer.org/ | | Note: This will NOT disable or override the CodeIgniter-specific | autoloading (application/config/autoload.php) */ $config['composer_autoload'] = './vendor/autoload.php';  
      o meu composer.json está assim:
      { "description": "The CodeIgniter framework", "name": "codeigniter/framework", "type": "project", "homepage": "https://codeigniter.com", "license": "MIT", "support": { "forum": "http://forum.codeigniter.com/", "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki", "irc": "irc://irc.freenode.net/codeigniter", "source": "https://github.com/bcit-ci/CodeIgniter" }, "require": { "php": ">=5.3.7", "mpdf/mpdf": "^7.1", "nfephp-org/sped-nfe": "^5.0", "nfephp-org/sped-da": "^1.0" }, "suggest": { "paragonie/random_compat": "Provides better randomness in PHP 5.x" }, "autoload": { "psr-4": { "Libraries\\": "application/libraries" } } }  
      após instalar a NFePhp através do composer, o caminho da pasta NFePhp está assim:
      nome_do_meu_sistema
      |____ application
      |______vendor
      |________nfephp-org
      |__________sped-common
      |__________sped-da
      |__________sped-gtin
      |__________sped-nfe

      Como consigo trazer os comando/libraries da NFe para poder utilizar no projeto.
       
      Grato,
       
      Cesar
×

Informação importante

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