Добавление чисел не дает ожидаемых результатов - PullRequest
0 голосов
/ 30 января 2011

У меня есть 3 числа, возвращенные из базы данных, которые мне нужно сложить вместе.В общей сложности 1740.01 я получаю как 10.00.Это числа с плавающей точкой.Вот фактические числа, с которыми у меня проблемы.

> 1,729.13
> 10.88
> 0.00

Как получить правильную сумму этих чисел?

РЕДАКТИРОВАТЬ

$cash = preg_replace('/\$/', '', $cash);
$card = preg_replace('/\$/', '', $card);
$check = preg_replace('/\$/', '', $check);

$cash = number_format(array_sum($cash), 2);
$card = number_format(array_sum($card), 2);
$check = number_format(array_sum($check), 2);
$total  = number_format( $cash + $card + $check, 2 );

1 Ответ

2 голосов
/ 30 января 2011

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

Предполагая, что $ cash, $ card и $ check являются массивами:

$cash = array_sum($cash);
$card = array_sum($card);
$check = array_sum($check);

$total  = number_format( $cash + $card + $check, 2 ); 

$cash = number_format( $cash, 2 );
$card = number_format( $card, 2 );
$check = number_format( $check, 2 );

Выполните любое форматирование после математики

EDIT

Используйте str_replace () вместо preg_replace(), чтобы убрать любой $, тогда это простое добавление, а не необходимость выполнять array_sum (), хотя я не уверен, откуда может возникнуть любой $, если значения DECIMAL 10,7 из базы данных

$cash = (float) str_replace( array('$',','), '', $cash );
$card = (float) str_replace( array('$',','), '', $card );
$check = (float) str_replace( array('$',','), '', $check );

$total  = number_format( $cash + $card + $check, 2 ); 

$cash = number_format( $cash, 2 );
$card = number_format( $card, 2 );
$check = number_format( $check, 2 );

(предполагается, что это ваш разделитель тысяч в строковых значениях для $ cash, $ card и $ check при выполнении str_replace ()

EDIT 2

Чтобы преобразовать массив $ cash в сумму его значений, очистив любой $ или, в строках:

$cash = array ( 0 => '$1729.13', 1 => '0.00', 2 => '$1,234.56' );

function cleanArrayValues($value) {
    return (float) str_replace( array('$',','), '', $value );
}

$cash = array_sum(array_map('cleanArrayValues',$cash));

Я добавил дополнительное значение в массив $ cash просто для

Вам нужно будет отфильтровать чеки $ card и $ вТочно так же, используя функцию обратного вызова cleanArrayValues ​​() (если они все массивы)

...