/** * Formata uma sequencia numérica incluindo os separadores de * decimais e de milhares * Funciona de forma análoga a number_format, com exceção de que recebe * uma string ao invés de um float e os valores default para separadores de * decimais e milhares estão no formato brasileiro * * @param mixed $number O valor a ser formatado * @param int $decimais A quantidade de casas decimais (default 2) * @param [string $separador_decimal=','] O separador de decimais * @param [string $separador_milhar='.'] O separador de milhares * @return string */ my_number_format($number,$decimais=2,$separador_decimal=",",$separador_milhar="."){ // Número vazio? if(trim($number)=="") return $number; // se for um double precisamos garantir que não será covertido em // notação científica e que valores terminados em .90 tenha o zero removido if(is_float($number) || is_double($number)){ $number = sprintf("%.{$decimais}f",$number); } // Convertendo para uma string numérica $number = preg_replace('#\D#','',$number); // separando a parte decimal $decimal=''; if($decimais>0){ $number = sprintf("%.{$decimais}f",($number / pow(10,$decimais))); if(preg_match("#^(\d+)\D(\d{{$decimais}})$#",$number,$matches)){ $decimal=$separador_decimal . $matches[2]; $number=$matches[1]; } } // formatando a parte inteira if($separador_milhar!=''){ $number = implode($separador_milhar,array_reverse(array_map('strrev',str_split(strrev($number),3)))); } return $number . $decimal; }