Pergunta

Eu quero usar number_format função em php. Por exemplo:

$number = 234.51;
echo number_format($number,2);

Isso funciona para números de flutuação, mas quero usá -lo para números diferentes. Se um número é decimal e não possui pontos flutuantes, ele mostra: 145.00. Como posso consertar isso? Quero dizer, quero mostrar tantos pontos flutuantes quanto necessário, não mais.

Foi útil?

Solução 2

Acho que não consigo conseguir o que quero do número_format, então fiz isso e funciona bem:

 public function floatNumber($number)
 {
      $number_array = explode('.', $number);
      $left = $number_array[0];
      $right = $number_array[1];
      return number_format($number, strlen($right));
 }

obrigado tudo para suas respostas.

Outras dicas

Investigue o printf e sprintf funções em vez de number_format.

Eles dão a capacidade de formatar números como você deseja.

printf("%d", $int) 

seria apropriado para um número inteiro decimal.

printf("%4.2f", $float) 

seria apropriado para um número de ponto flutuante com dois lugares decimais.

number_format Parece ser destinado à internacionalização da produção de moeda, mas não acho que seja isso que você deseja, porque você mencionou números 'inteiros' decimais.

Não sei uma maneira melhor de fazer isso, mas você pode comparar o tipo, como o código abaixo:

$number = 234.159;
if(is_float($number)) {
 echo number_format($number, 2);
}else {
 echo $number;
}

Embora seja um pouco rápido e sujo, você pode simplesmente fazer um ...

str_replace('.00', '', number_format($potentialFloat, 2));

Longe do ideal, mas eficaz.

Eu acho que o principal problema é definir quantas posições são necessárias. Você definiria 13.01 como 13 porque o primeiro decimal foi 0? Como o Formato Printf e Number precisa que você saiba quantos decimais, não sei se isso funcionaria para você.

Talvez algo assim (que seja muitas funções, mas procure o primeiro 0 e depois retorna a string truncada). Sim, é intensivo, mas pode ser a melhor maneira para você.

function show_number($number, $max = 8){
  if(strpos($number, '.')){
    $decimal = strpos($number, '.');
    if(strpos($number, '.0')){
      return substr($number, 0, $decimal);//returns whole if zero is first
    } else {
      if(strpos(substr($number, $decimal, $max), '0')){
        $zero = strpos(substr($number, $decimal, $max), '0');
        return substr($number, 0, $decimal+$zero);//returns number w/0 first zero
      } else {
        return substr($number, 0, $decimal+$max+1); //returns number with max places
      }
    }
  } else {
    return $number; //returns number if no decimals
  }
}
rtrim(number_format($number, 2), '0.');

Eu uso o seguinte para me livrar de zeros à direita:

// Trims a floating point number so there are no trailing zeros. For example:
// 1.00 -> 1
// 1.10 -> 1.1
function trimFloatingPoint($input) {
    $strNum = strval($input);

    while(substr($strNum, -1, 1) == '0')
        $strNum = substr($strNum, 0, strlen($strNum) -1);

    // Trailing zeros are gone. How about the trailing period?
    if(substr($strNum, -1, 1) == '.')
        $strNum = substr($strNum, 0, strlen($strNum) -1);

    return $strNum;
}
$x = $x - floor($x)

Vou te dar o ponto flutuante certo ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top