Строка PHP для Float

Я совсем не знаком с PHP и у меня был быстрый вопрос.

У меня есть 2 переменные pricePerUnit и InvoicedUnits. Вот код, который устанавливает эти значения:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

Если я выведу это, я получу правильные значения. Скажем, 5000 единиц счета и 1.00 за цену.

Теперь мне нужно показать общую сумму потрачено. Когда я умножаю эти два значения вместе, это не работает (как и ожидалось, это строки).

Но я понятия не имею, как разобрать/преобразовать/преобразовать переменные в PHP.

Что я должен делать?

Ответ 3

Хорошо, если пользователь напишет 1,00,000, тогда floatvar покажет ошибку. Итак -

floatval(preg_replace("/[^-0-9\.]/","",$input));

Это намного надежнее.

Использование:

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));

Ответ 4

Работа с разметкой в поплавках - нетривиальная задача. В английской/американской нотации вы форматируете тысячу плюс 46*10-2:

1,000.46

Но в Германии вы бы поменяли запятую и точку:

1.000,46


Это делает очень трудным угадывание правильного числа в многоязычных приложениях.
Я настоятельно рекомендую использовать Zend_Measure из Zend Framework для этой задачи. Этот компонент будет анализировать строку с плавающей точкой на языке пользователя.

Ответ 5

Используйте эту функцию, чтобы вывести значение float из любого типа текстового стиля:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

Это решение не зависит от настроек языка. Таким образом, для пользовательского ввода пользователи могут вводить значения float любым способом. Это действительно полезно, например. когда у вас есть проект, который работает только на английском языке, но люди во всем мире используют его и, возможно, не имеют в виду, что проекту требуется точка вместо запятой для значений float. Вы можете добавить javascript в микс и выбрать параметры браузера по умолчанию, но многие люди задают эти значения на английском, но все же набирают 1,25 вместо 1,25 (особенно, но не ограничиваясь, отрасль перевода, исследования и ИТ).

Ответ 6

Я столкнулся с проблемой стандартного способа сделать это:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

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

Чтобы это исправить, я сделал следующее:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

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

Ответ 7

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

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}