formatPercentage Arredondando!

Olá Galera, bom dia!!

Como faço para o format percentage não arredondar meu número?


Yii::app()->getLocale()->getNumberFormatter()->formatPercentage(0.024);

ele manda como: 3% em vez de 2,4%

Eric,

Eu estava dando uma estudada no formatPercentagem, ocorre o seguinte problema ou nen será problema.

O Yii ele faz o arrendondamento na classe CNumberFormat na função formatNumber(), ocorre o arrendondamento por que a função recebe o $format[‘maxDecimalDigits’] com valor zero(0), tentei de qualquer formar enviar um valor 1, ou qualquer outro valor, assim ele aceitava o 2,4%, mais para mim sempre arrendondo para 2%.

Acho que nesse caso seria melhor você fazer diretamente no PHP.

Verifica no seu config/main.php se está setado a ‘language’ => ‘pt_br’.

estou setando sim…

me explica uma coisa:

eu creio ser possível sobreescrever a classe CNumberFormat pelo main (digo, criar uma classe e setar como padrão ela no main), como façø isso? pq no sistema inteiro, ela arredonda, e eu não queria…

só se eu fizesse um helper e usar ele em vez do formatpercentage tb né?

Dá pra você extender a classe sim, mais eu vi no core e umas 4 ou mais função que vai precisar copiar, e alterar somente 1 hehehe

Acho que um helper te ajudaria mais rápido.

Creio que no framework não exista uma forma flexível para variar essa máscara ou formato nas várias visões. Portanto se vc deseja mostrar percentuais com casas decimais variadas pelo sistema terá que fazer de outra forma.

Veja abaixo uma alternativa:

Se vc definiu em seu protected/config/main.php - ‘language’=>‘pt_br’

Faça a alteração em: yii/framework/i18n/data/pt_br.php

linha 30: ‘percentFormat’ => ‘#,##0%’,

altere para ‘percentFormat’ => ‘#,##0.0%’,

Flws!

:wq

Assim o resultando fica: 2,4,0%

Estranho, aqui deu certo.

Teoricamente deveria funcionar Newerton. Olha ae o script que determina os dígitos a partir desse pattern.

yii/framework/i18n/CNumberFormatter.php - linhas: 240-257


// find out things about decimal part

		if(($pos=strpos($pat,'.'))!==false)

		{

			if(($pos2=strrpos($pat,'0'))>$pos)

				$format['decimalDigits']=$pos2-$pos;

			else

				$format['decimalDigits']=0;

			if(($pos3=strrpos($pat,'#'))>=$pos2)

				$format['maxDecimalDigits']=$pos3-$pos;

			else

				$format['maxDecimalDigits']=$format['decimalDigits'];

			$pat=substr($pat,0,$pos);

		}

		else   // no decimal part

		{

			$format['decimalDigits']=0;

			$format['maxDecimalDigits']=0;

		}

Flws!

Então, antes de posta pro Eric debuguei essa função toda, o problema ta mesmo no ‘percentFormat’ achar a combinação certa para colocar os decimais, por que no round() está chegando $format[‘maxDecimalDigits’] = 0, correto era chegar pelo menos 1, para adicionar 1 casa decimal.

Eu testei na versão 1.1.10, ele me retorna 2%, com a alteração para ‘#,##0.0%’ ele me retorna 2,4,0%.

Eu testei uma solução e o número foi formatado para 2,4%.

Como fiz:

  1. Criar uma protected/locale/data

  2. Copiar os arquivos que seu aplicativo for usar da pasta framework/i18n/data para a pasta criada

  3. Adicionar no arquivo protected/config/main.php a linha ‘localeDataPath’ => DIR . ‘/../locale/data’,

  4. Alterar o arquivo protected/locale/data/<seu_locale_id>.php a formatação de porcentagem para: #,##0.0%

Fazendo dessa forma o fonte do framework não é alterado, evitando problemas futuros.

Se quiser uma forma mais rápida é possível chamar o numberFormater com a máscara desejada: Yii::app()->numberFormatter->format(’#,##0.0%’, 0.024)

Abraço

Desculpe a todos.

O que o Thiago propos está funcionando.

O que o TXGruppi postou seria a forma mais correta de fazer sem mexer no core do Yii, assim vocês ficam livre de qualquer aborrecimento na atualização do framework.

O meu erro era index.php do framework que eu tinha definido o setlocale();

Estava assim:

setlocale(LC_ALL, ‘ptb’);

Estava errado, alterei para:

setlocale(LC_ALL, ‘pt_BR’);

Assim o:

Yii::app()->numberFormatter->formatPercentage(0.024)

Volto a mostrar o valor correto de 2,4%.

Sem problemas Newerton!

Flws.