PHP String to Float - PullRequest
       18

PHP String to Float

94 голосов
/ 27 января 2009

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

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

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

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

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

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

Что мне делать?

Ответы [ 6 ]

162 голосов
/ 27 января 2009
$rootbeer = (float) $InvoicedUnits;

Должен сделать это за вас. Проверьте Type-Juggling . Вам также следует прочитать Преобразование строк в числа .

52 голосов
/ 27 января 2009

Требуется функция без учета языка floatval :

float floatval (mixed $ var) - получает значение типа float для строки.

Пример:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343
20 голосов
/ 18 июля 2010

Ну, если пользователь напишет 1 000 000, то floatvar выдаст ошибку. Итак -

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

Это гораздо надежнее.

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

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));
7 голосов
/ 18 июля 2010

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

1,000.46

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

1.000,46


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

1 голос
/ 12 ноября 2016

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

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

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

0 голосов
/ 05 марта 2019

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

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

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

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

$string = "one";

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

echo $float; : ( Prints nothing )

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

...