проблемы с number_format и отрицательными числами

Прямо сейчас я храню числа как двойные (11,3) в своей базе данных. Некоторые числа могут быть большими отрицательными. Тот, с которым я сейчас играю, стоит -3000.000.

Когда я использую number_format только для 3000 000, он возвращает 3000 Когда я использую number_format для -3000 000, он возвращает -3

Любые идеи, почему это происходит и что я могу сделать, чтобы это исправить? Я сейчас в недоумении, почему это происходит.

Спасибо,

Джефф

EDIT: я заставил его работать со следующим кодом:

$number = abs($row['Amount']) * -1; $final = number_format($number,2);

Теперь, почему это будет работать, а не:

$final = number_format($row['Amount'],2); 

У меня нет подсказки, но, по крайней мере, я нашел решение, спасибо за помощь :)


person jefffan24    schedule 21.06.2011    source источник
comment
Этот php -R 'echo number_format(-3000.000);' возвращает -3,000. Можете ли вы подтвердить, что БД отправляет правильную информацию?   -  person cwallenpoole    schedule 21.06.2011
comment
какая СУБД? В некоторых версиях PHP были ошибки, связанные с некоторыми базами данных - PHP неправильно извлекал некоторые числовые значения.   -  person Milan Babuškov    schedule 21.06.2011
comment
Только что сделал это: echo number_format(3000.000,2) * -1; и получил -3... Я не понимаю, что здесь происходит.   -  person jefffan24    schedule 21.06.2011


Ответы (4)


попробуй это:

if($input<0){
  $number = abs($input);
  $result = number_format($number) * -1;
}else {
  $result = number_format($input);
}
person Shameer    schedule 21.06.2011
comment
Даже с этим я все еще получаю 3: echo number_format(3000.000,2) * -1; Я не понимаю, что происходит.... - person jefffan24; 21.06.2011
comment
См. @salathe. Вы берете строку и умножаете ее на -1. Запятая в "3,000" приведет к тому, что математическая операция будет 3 * -1. - person Paul DelRe; 21.06.2011
comment
Предложенный код не будет работать, так как "3,000.00" * -1 приводит к изменению типа строки (до 3) перед умножением. - person salathe; 21.06.2011
comment
Да, я понял это, но я выбрал его / ее ответ как правильный, потому что это привело меня к ответу :) - person jefffan24; 21.06.2011
comment
Итак, вы отметили неправильный ответ как правильный... Я думаю, что более точным выбором было бы написать свой собственный правильный ответ и отметить его как правильный. Это будет жить в Интернете и может ввести в заблуждение многих людей в течение следующих нескольких лет. - person Paul DelRe; 21.06.2011

Результатом number_format(-3000.000, 2) является строка, "-3,000.00".

Если вы этого не понимаете, обновите вопрос, указав код, который воспроизводит вашу проблему.

person salathe    schedule 21.06.2011

Сначала убедитесь, что ваш номер извлечен как -3000 из базы данных. В противном случае предыдущие ответы и комментарии хороши.

person adrian7    schedule 21.06.2011
comment
Да, именно поэтому я пришел сюда. У меня вроде работает версия Shameer, осталось разобраться с одной ошибкой. - person jefffan24; 21.06.2011

по предложению Шамира я пришел к этому решению.

будут возвращены конечные нули для отрицательных значений (вероятно, как и ожидалось):

if($input < 0){
    return number_format(0-abs($input), 2, ',', '');
}
else {
    return number_format((float)$input, 2, ',', '');
}
person Martin Zeitler    schedule 05.03.2014