Ir para conteúdo

Arquivado

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

verneklavor

gravar no banco MySQL monetário

Recommended Posts

Bom dia,

 

estou querendo guardar o seguinte valor no banco de dados MySQL, o campo é DECIMAL(12,2).

 

Estou querendo guardar: 19,200.00 mas só grava no banco 19.00.

 

 

Como faço? É melhor gravar no banco como VARCHAR? e na hora que for realizar operações eu converto?

 

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O formato no banco de dados esta correto, o que voce deve fazer e tratar os dados pra gravar no banco de dados e na hora de exibir.

 

Formatando para colocar no banco de dados

function converterMoedaMysql($val){
    $recebeValor = $val;
    $converterValor = str_replace('.','',$recebeValor);
    $converterValor = str_replace(',','.',$converterValor);
    return $converterValor;
}

echo converterMoedaMysql('19.200,00');

 

Fomatando para exibir com php

 

 

function converterMoedaPhp($val){
    return number_format($val,2,',','.');
}

echo converterMoedaPhp('19200.00');

Compartilhar este post


Link para o post
Compartilhar em outros sites

A melhor forma de gravar um valor monetário no banco de dados é usando um campo do tipo FLOAT ou DOUBLE, pois isso permitirá que se faça cálculos com esses valores posteriormente, o que não será possível com os tipos CHAR ou VARCHAR.

 

Quando for inserir o valor, você deve remover todos os pontos e vírgulas, a não ser que o ponto represente um separador de fração (no caso, de centavos).

 

Quando for imprimir o valor, use a função money_format para formata-lo como você desejar.

 

Exemplo:

money_format("%10.2n", 15000.35);

irá retornar [inline]R$ 15.000,35[/inline].

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando fazer dessa forma:

 

<?php
$recebeValor = '3,006.00';
echo $converterValor = str_replace(',','*',$recebeValor) . "<br>"; //3*006.00
echo $converterValor = str_replace('*','',$recebeValor) . "<br>";  //3006.00
  echo $converterValor; //3,006.00 ???
?>
Mas está retornando errado ainda, alguém poderia ajudar?
Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisa remover todos os caracteres não-numéricos, separando cada conjunto de números em partes e definindo a última parte como a parte fração (de centavos).

 

Por exemplo, se o usuário digitar [inline]15.555,78[/inline], esse valor deve ser dividido em três partes numéricas: [inline]15[/inline], [inline]555[/inline] e [inline]78[/inline], as (duas) primeiras partes devem ser juntadas e a última parte (78) é definida como a parte fração, depois tudo é convertido em ponto-flutuante, resultando no valor [inline]15555.78[/inline], que está pronto para ser armazenado no banco de dados em um campo do tipo FLOAT ou DOUBLE.

 

Um exemplo de função que faz isso:

function sanear_valor($valor)
{
    // Pega apenas as partes numéricas
    $partes = array_filter(preg_split("/([\D])/", $valor), 'strlen');
    
    // Separa a fração do inteiro
    $frac = count($partes) > 1 ? array_pop($partes) : "0";
    $inteiro = implode("", $partes);
    
    // Junta tudo, converte para ponto-flutuante e arredondanda
    return round((float) ($inteiro . "." . $frac), 2);

}

 

Agora sobre como mostrar o valor formatado para o usuário, ou seja, mostrar esse número [inline]15555.78[/inline] como [inline]15.555,78[/inline], há duas opções.

 

usando number_format:

$valor = 15555.78;
echo "R$ " . number_format($valor, 2, ",", "."); // R$ 15.555,78

ou usando money_format:

// Define o locale monetário
setlocale(LC_MONETARY, 'pt_BR');
 
echo money_format(".2n", $valor);

A função money_format não funciona no PHP para Windows. Se você tentar usá-la, irá retornar erro:

Fatal error: Call to undefined function money_format()

 

Para contornar isso, você deve definir a função:

// Verificar se o script está rodando no Windows
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    // Coloque o código da função aqui...

   /*
       O código está no comentário de Rafael M. Salvioni na página:
       http://php.net/manual/pt_BR/function.money-format.php
       
       function money_format($format, $number) {

       }
   */
}
// Atenção: esse bloco de código deve vir antes de qualquer chamada à função money_format
Embora pareça (e é) mais complicada, a função money_format tem a vantagem de formatar valores em diversos formatos e suporte a locales.

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.