money_format()
Artigo sobre a função PHP money_format(), usada para formatar um número como uma string de moeda. Útil para trabalhar com valores monetários em PHP.
A função money_format() formata um número como uma string de moeda, aplicando um separador de milhares, um ponto decimal e um símbolo de moeda de acordo com a localidade ativa.
Importante: money_format() está obsoleta desde o PHP 7.4 e foi removida no PHP 8.0. Ela também nunca existiu no Windows. Se você estiver escrevendo código novo, vá direto para a seção Substituto moderno abaixo — o restante desta página documenta a função legada para que você possa ler e manter código PHP antigo.
Sintaxe
string money_format ( string $format , float $number )A função recebe dois parâmetros:
$format– uma string que descreve como formatar o número. Ela contém uma ou mais especificações de conversão (cada uma começando com%), de forma semelhante aosprintf(). Qualquer texto fora de uma especificação é impresso literalmente.$number– o valor numérico a ser formatado.
Ela retorna a string formatada.
Especificadores de formato comuns
| Especificador | Significado | Exemplo de saída (en_US, 1234.56) |
|---|---|---|
%n | Formato de moeda nacional (local) | $1,234.56 |
%i | Formato de moeda internacional | USD 1,234.56 |
%.2n | Formato nacional, 2 casas decimais | $1,234.56 |
%(n | Envolve valores negativos entre parênteses | ($1,234.56) |
%!n | Suprime o símbolo de moeda | 1,234.56 |
A localidade (definida com setlocale()) determina qual símbolo de moeda, caractere de agrupamento e ponto decimal são usados.
Exemplo
<?php
$number = 1234.56;
setlocale(LC_MONETARY, 'en_US');
echo money_format('%n', $number);
?>Aqui $number contém um valor de ponto flutuante, e a chamada setlocale() configura a localidade monetária para en_US. A saída é:
$1,234.56Atenção: setlocale() retorna false se a localidade solicitada não estiver instalada no servidor, e money_format() então silenciosamente volta a um padrão. Sempre verifique se o nome da localidade (por exemplo, en_US vs. en_US.UTF-8) realmente existe no seu sistema.
Substituto moderno: NumberFormatter
Como money_format() foi removida no PHP 8, a abordagem recomendada é a classe NumberFormatter da extensão intl. Ela reconhece localidades, funciona em todas as plataformas (incluindo Windows) e usa dados ICU em vez da localidade do sistema:
<?php
$number = 1234.56;
$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency($number, 'USD');
?>Saída:
$1,234.56Para formatar o mesmo valor para uma localidade e moeda diferentes, basta alterar a localidade do construtor e o código de moeda:
<?php
$number = 1234.56;
$de = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $de->formatCurrency($number, 'EUR');
?>Saída (o agrupamento alemão usa ponto para milhares e vírgula para decimais):
1.234,56 €Quando usar cada um
- Código novo: use
NumberFormatter::formatCurrency()— é o único formatador de moeda disponível no PHP 8+. - Código legado no PHP 7.4 ou anterior:
money_format()ainda funciona, mas emitirá um aviso de obsolescência; planeje migrar. - Números simples sem moeda: se você precisar apenas de um separador de milhares e casas decimais fixas (sem símbolo de moeda ou regras de localidade),
number_format()é mais leve.
Funções relacionadas
number_format()– formata um número com agrupamento de milhares.setlocale()– define a localidade usada pormoney_format()e outras funções sensíveis à localidade.sprintf()/printf()– formatação de strings de uso geral.round()– arredonda um valor antes de formatá-lo como moeda.