2012-05-30 1 views
0

$numval = 12345.50;Тысячи разделителей с money_format?

Желаемый результат:

12 345,50

запятая вместо точки не проблема, но как я могу получить разделитель тысяч, чтобы быть белым пространством?

Я заметил PHP money format with spaces, но это не дублирующее сообщение. Использование number_format не имеет значения, поскольку оно округляет входное значение. Я не могу позволить пропущенным через него значения округлять.

Есть ли встроенный способ сделать то, что делает number_format(), но без округления значения или мне нужно написать свою собственную функцию для этого?

+2

Просто побочное примечание - я, как правило, склоняюсь к number_format() для всех случаев (в том числе форматирования денег), потому что [money_format()] (http://php.net /manual/en/function.money-format.php) зависит от strfmon, который не все операционные системы имеют * cough * windows! * cough *, поэтому код, который его использует, может не работать на всех серверах. –

ответ

2

Если округление из вопрос, так что значения float. Вы должны вернуться к целым числам, если вы не хотите округления, поскольку арифметика с плавающей запятой не является точной. В этом случае вам придется реализовать функцию форматирования самостоятельно.

Это особенно true, если вы обращаетесь с деньгами. См., Например, Why not use Double or Float to represent currency?

+0

Не совсем то, что я спросил, но включил такой важный момент, что я должен принять это. Никогда не используйте поплавки или парные пары, чтобы снова обрабатывать деньги. Никогда. Спасибо. – budwiser

1

Это очень похоже на версию функции, которую вы хотите использовать:

string number_format (float $number , int $decimals = 0 , string $dec_point = '.' , string $thousands_sep = ',') 

Так, например:

$newNumber = number_format($oldNumber, 2, ",", " "); 

Для получения дополнительной информации ознакомьтесь с http://php.net/manual/en/function.number-format.php

+0

Какой параметр необходимо установить, чтобы не сделать 'number_format' круглым значением? – hakre

+0

'int $ decimals = 0' Указывает, сколько мест он округляет. По умолчанию это 0, что означает отсутствие десятичных знаков, 1 означает одно место точности и т. Д. – dpk2442

+0

Я спрашиваю, как отключить округление, вы сказали мне, как делать округление. Означает ли это, что вы не знаете, как отключить округление с помощью 'number_format'? Я неправильно понял вопрос о том, что он спрашивает о том, как не обойти **? – hakre

2

От this comment страницы number_format() (я изменил функцию, чтобы она соответствовала значениям по умолчанию для number_format).

Для предотвращения закругления:

function fnumber_format($number, $decimals=0, $dec_point='.', $thousands_sep=',') { 
     if (($number * pow(10 , $decimals + 1) % 10) == 5) //if next not significant digit is 5 
      $number -= pow(10 , -($decimals+1)); 

     return number_format($number, $decimals, $dec_point, $thousands_sep); 
} 
+0

+1 для ответа на вопрос ^^ – hakre

+0

Но это тоже не сработает. Значения Float по своей сути округлены. –