Fatal error: Call to undefined function money_format()
Si estamos trabajando con WAMP o XAMPP puede que nos topemos con este error.
( ! ) Fatal error: Call to undefined function money_format()
Según la documentación de PHP La función money_format() sólo está definida si el sistema tiene capacidad strfmon. Por ejemplo, Windows no lo hace, así que money_format() no está definido en Windows.
Para solventarlo crearemos un archivo que adjuntaremos en nuestro php.ini
Abre el php.ini y busca la línea con la palabra «auto_prepend_file» y sustituye el valor vacío con
auto_prepend_file = "C:\wamp64\money_format.php"
Ahora crea el archivo en la misma ruta con la siguiente función de PHP
<?php
function money_format($formato, $valor)
{
if (setlocale(LC_MONETARY, 0) == 'C') {
return number_format($valor, 2);
}
$locale = localeconv();
$regex = '/^' . // Inicio da Expressao
'%' . // Caractere %
'(?:' . // Inicio das Flags opcionais
'\=([\w\040])' . // Flag =f
'|' .
'([\^])' . // Flag ^
'|' .
'(\+|\()' . // Flag + ou (
'|' .
'(!)' . // Flag !
'|' .
'(-)' . // Flag -
')*' . // Fim das flags opcionais
'(?:([\d]+)?)' . // W Largura de campos
'(?:#([\d]+))?' . // #n Precisao esquerda
'(?:\.([\d]+))?' . // .p Precisao direita
'([in%])' . // Caractere de conversao
'$/'; // Fim da Expressao
if (!preg_match($regex, $formato, $matches)) {
trigger_error('Formato invalido: ' . $formato, E_USER_WARNING);
return $valor;
}
$opcoes = array(
'preenchimento' => ($matches[1] !== '') ? $matches[1] : ' ',
'nao_agrupar' => ($matches[2] == '^'),
'usar_sinal' => ($matches[3] == '+'),
'usar_parenteses' => ($matches[3] == '('),
'ignorar_simbolo' => ($matches[4] == '!'),
'alinhamento_esq' => ($matches[5] == '-'),
'largura_campo' => ($matches[6] !== '') ? (int) $matches[6] : 0,
'precisao_esq' => ($matches[7] !== '') ? (int) $matches[7] : false,
'precisao_dir' => ($matches[8] !== '') ? (int) $matches[8] : $locale['int_frac_digits'],
'conversao' => $matches[9]
);
if ($opcoes['usar_sinal'] && $locale['n_sign_posn'] == 0) {
$locale['n_sign_posn'] = 1;
} elseif ($opcoes['usar_parenteses']) {
$locale['n_sign_posn'] = 0;
}
if ($opcoes['precisao_dir']) {
$locale['frac_digits'] = $opcoes['precisao_dir'];
}
if ($opcoes['nao_agrupar']) {
$locale['mon_thousands_sep'] = '';
}
$tipo_sinal = $valor >= 0 ? 'p' : 'n';
if ($opcoes['ignorar_simbolo']) {
$simbolo = '';
} else {
$simbolo = $opcoes['conversao'] == 'n' ? $locale['currency_symbol']
: $locale['int_curr_symbol'];
}
$numero = number_format(
abs($valor),
$locale['frac_digits'],
$locale['mon_decimal_point'],
$locale['mon_thousands_sep']
);
$sinal = $valor >= 0 ? $locale['positive_sign'] : $locale['negative_sign'];
$simbolo_antes = $locale[$tipo_sinal . '_cs_precedes'];
$espaco1 = $locale[$tipo_sinal . '_sep_by_space'] == 1 ? ' ' : '';
$espaco2 = $locale[$tipo_sinal . '_sep_by_space'] == 2 ? ' ' : '';
$formatado = '';
switch ($locale[$tipo_sinal . '_sign_posn']) {
case 0:
if ($simbolo_antes) {
$formatado = '(' . $simbolo . $espaco1 . $numero . ')';
} else {
$formatado = '(' . $numero . $espaco1 . $simbolo . ')';
}
break;
case 1:
if ($simbolo_antes) {
$formatado = $sinal . $espaco2 . $simbolo . $espaco1 . $numero;
} else {
$formatado = $sinal . $numero . $espaco1 . $simbolo;
}
break;
case 2:
if ($simbolo_antes) {
$formatado = $simbolo . $espaco1 . $numero . $sinal;
} else {
$formatado = $numero . $espaco1 . $simbolo . $espaco2 . $sinal;
}
break;
case 3:
if ($simbolo_antes) {
$formatado = $sinal . $espaco2 . $simbolo . $espaco1 . $numero;
} else {
$formatado = $numero . $espaco1 . $sinal . $espaco2 . $simbolo;
}
break;
case 4:
if ($simbolo_antes) {
$formatado = $simbolo . $espaco2 . $sinal . $espaco1 . $numero;
} else {
$formatado = $numero . $espaco1 . $simbolo . $espaco2 . $sinal;
}
break;
}
if ($opcoes['largura_campo'] > 0 && strlen($formatado) < $opcoes['largura_campo']) {
$alinhamento = $opcoes['alinhamento_esq'] ? STR_PAD_RIGHT : STR_PAD_LEFT;
$formatado = str_pad(
$formatado,
$opcoes['largura_campo'],
$opcoes['preenchimento'],
$alinhamento
);
}
return $formatado;
}
Comments are closed.