Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
Estou tentando gravar: 150.00
Mas no banco ele está gravando 15000.00 (acrescentando .00 após o valor digitado)
posta ai o código completo de como você esta usando...
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].
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.
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](http://php.net/manual/pt_BR/function.money-format.php):
// 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_formatEmbora pareça (e é) mais complicada, a função money_format tem a vantagem de formatar valores em diversos formatos e suporte a locales.Mangakah, deu certo. obrigado.
Não conhecia esta função money_format muito boa ela...
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
Fomatando para exibir com php