2015-10-06 2 views
0

например, позволяет сказать, что я хочу 3 цифры, то:Как отформатировать номер так, чтобы он имел определенное количество цифр?

1 -> 1.00 
10 -> 10.0 
100 -> 100 
1000 -> 1000 // don't lop off any numbers, as they're all significant 

Я думал, что я мог бы сделать это с помощью:

number_format($n, max(0,$digits-strlen((string)intval($n))), null, '') 

, который работает для всех перечисленных выше случаев, но она не для 99.99 (предоставления 100.0 вместо 100).

Так что я не совсем уверен, как это сделать. Подсчет количества цифр перед десятичной точкой не будет работать, потому что он может измениться после округления.

N.B. когда я говорю «цифры», я имею в виду общее количество цифр, до и после запятой. Также обратите внимание, что это не совсем то же самое, что «значимые цифры», так как я считаю «1000» «4 цифрами», что означает «1 значимая цифра» и «0 десятичных цифр».

+0

@ Dagon Я не уверен, как я могу это сделать без предварительного тестирования, если округление добавит еще одну цифру, но да, я уверен, что смогу что-то придумать. – mpen

+0

@PaulCrovella Да, этот вопрос касается форматирования. Округление должно выполняться только тогда, когда есть десятичные значки, и они не могут вписываться в выделенное количество цифр. – mpen

+0

Это не про округление? Потому что для округления у вас есть хорошие функции, которые отлично округляются. Какова ваша цель? – markus

ответ

1

попробовать ниже

number_format($n, max(0,$digits-strlen((string) ((strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n)))))), null, ''); 

php > $n=1; 
php > print number_format($n, max(0,$digits-strlen((string) ((strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n)))))), null, ''); 
1.00 
php > $n=10; 
php > print number_format($n, max(0,$digits-strlen((string) ((strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n)))))), null, ''); 
10.0 
php > $n=100;                                       
php > print number_format($n, max(0,$digits-strlen((string) ((strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n)))))), null, ''); 
100 
php > $n=1000;                                       
php > print number_format($n, max(0,$digits-strlen((string) ((strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n)))))), null, ''); 
1000 
php > $n=99.99; 
php > print number_format($n, max(0,$digits-strlen((string) ((strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n)))))), null, ''); 
100 
php > $n=99.9; 
php > print number_format($n, max(0,$digits-strlen((string) ((strlen(str_replace('.','',(string)$n))<=$digits) ? intval($n) : (max(round($n),intval($n)))))), null, ''); 
99.9 
+0

Не работает для '99.9'. Должна давать '99.9', но поскольку вы не включали никаких аргументов в' round', это дает '100'. – mpen

+0

Измененный ответ выше ... попробуйте сейчас .. – narendra

+0

Выражения верны для положительных чисел. – mpen

0

я придумал что-то. Вот суть его:

function _whole_digit_count($n) { 
    return strlen(abs((int)$n)); 
} 

function _does_round_up($n, $d) { 
    return _whole_digit_count(number_format($n, $d, null, '')) > _whole_digit_count($n); 
} 

function round_digits($size, $digits=3) { 
    $wd = _whole_digit_count($size); 
    $decimals = $digits - $wd; 
    if($decimals > 0) { 
     if(_does_round_up($size, $decimals)) { 
      --$decimals; 
     } 
    } 

    return number_format($size, $decimals, null, '') 
} 

В основном, мы используем number_format здесь, чтобы сделать округление и добавить 0s, но сначала мы должны вычислить, сколько знаков после запятой, мы хотим. Мы делаем это, вычитая число цифр слева от десятичной точки.

Однако это может привести к округлению, так что на все число добавляется другая цифра. В этом сценарии мы должны вычесть дополнительное десятичное место.

Смежные вопросы