Ответ 1
$rootbeer = (float) $InvoicedUnits;
Должно сделать это за вас. Проверьте Type-Juggling. Вы также должны прочитать Преобразование строк в номера.
Я совсем не знаком с PHP и у меня был быстрый вопрос.
У меня есть 2 переменные pricePerUnit
и InvoicedUnits
. Вот код, который устанавливает эти значения:
$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);
Если я выведу это, я получу правильные значения. Скажем, 5000
единиц счета и 1.00
за цену.
Теперь мне нужно показать общую сумму потрачено. Когда я умножаю эти два значения вместе, это не работает (как и ожидалось, это строки).
Но я понятия не имею, как разобрать/преобразовать/преобразовать переменные в PHP.
Что я должен делать?
$rootbeer = (float) $InvoicedUnits;
Должно сделать это за вас. Проверьте Type-Juggling. Вы также должны прочитать Преобразование строк в номера.
Вы хотите функцию, отличную от локали floatval
:
float floatval (mixed $var) - возвращает значение float строки.
Пример:
$string = '122.34343The';
$float = floatval($string);
echo $float; // 122.34343
Хорошо, если пользователь напишет 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));
Работа с разметкой в поплавках - нетривиальная задача. В английской/американской нотации вы форматируете тысячу плюс 46*10-2
:
1,000.46
Но в Германии вы бы поменяли запятую и точку:
1.000,46
Это делает очень трудным угадывание правильного числа в многоязычных приложениях.
Я настоятельно рекомендую использовать Zend_Measure
из Zend Framework для этой задачи. Этот компонент будет анализировать строку с плавающей точкой на языке пользователя.
Используйте эту функцию, чтобы вывести значение 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 (особенно, но не ограничиваясь, отрасль перевода, исследования и ИТ).
Я столкнулся с проблемой стандартного способа сделать это:
$string = "one";
$float = (float)$string;
echo $float; : ( Prints 0 )
Если нет действительного числа, парсер не должен возвращать число, он должен выдать ошибку. (Это условие, которое я пытаюсь уловить в своем коде, YMMV)
Чтобы это исправить, я сделал следующее:
$string = "one";
$float = is_numeric($string) ? (float)$string : null;
echo $float; : ( Prints nothing )
Затем, перед дальнейшей обработкой преобразования, я могу проверить и вернуть ошибку, если не было правильного разбора строки.
Если вам нужно обработать значения, которые не могут быть преобразованы отдельно, вы можете использовать этот метод:
try {
$valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
// bail here if you need to
}