Строка PHP для плавающей

120

Я совсем не знаком с PHP, и у меня возник вопрос.

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

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

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

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

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

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

Nik
источник

Ответы:

202
$rootbeer = (float) $InvoicedUnits;

Должен сделать это за тебя. Ознакомьтесь с типом жонглирования . Вы также должны прочитать преобразование строки в числа .

Сэмпсон
источник
Это самый простой метод ... но иногда я сталкивался с проблемами при выполнении этого с определенными конфигурациями базы данных и VARCHAR>11длиной ... еще не сузил, почему именно.
Талви Ватия
2
^ стоит отметить, что (float) удаляет 0 из строки, если это первая цифра
Также обратите внимание, что «11000.00» будет выводить 11 вместо ожидаемых 11000.00
CodeJunkie,
65

Вам нужна функция, не зависящая от локалиfloatval :

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

Пример:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343
earino
источник
4
Престижность за упоминание осведомленности о местности. Я только что потратил 1,5 часа на отслеживание проблемы, вызванной разными языковыми стандартами, вызывающими (float)конвертацию на первом сервере в "," а на втором в "",
доктор Джанлуиджи Зейн Занеттини
23

Что ж, если пользователь напишет 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));
ХАДИ
источник
7
Вместо Ерегли использование пропитанного связующим $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza
4
Да, ereg, эта функция УСТАРЕЛА. Поэтому нужно использовать PREG вместо EREG :)
ХАДИ
9

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

1,000.46

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

1.000,46


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

Тобиас П.
источник
3
В настоящее время (+3 года) можно использовать NumberFormatter начиная с PHP 5.3 с intlрасширением.
zamnuts
1
PHP 5.3 был доступен, когда я ответил на вопрос, но до вашего комментария я не знал об этой единственной функции, поскольку есть десятки библиотек, делающих что-то подобное. Но у них не будет такого хорошего охвата локалей, как у расширения intl. Спасибо, постараюсь вспомнить.
Тобиас П.
1

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

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 (особенно, но не ограничиваясь отраслью переводов, исследованиями и ИТ)

Hafenkranich
источник
какие-либо комментарии о том, почему это плохо / где это не удается?
Hafenkranich
или есть такой же гибкий способ, который быстрее?
Hafenkranich
1
Он использует флаг e, который «больше не поддерживается». Это мое предположение.
Лейф
0

У меня возникла проблема со стандартным способом сделать это:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

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

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

$string = "one";

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

echo $float; : ( Prints nothing )

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

Моррис Буэль
источник
0

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

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}
Дженни Теуниссен
источник
0

вы можете перейти по этой ссылке, чтобы узнать больше о том, как преобразовать строку / число в число / число с плавающей запятой / десятичное число в PHP. ЗДЕСЬ, ЧТО ГОВОРИТ ЭТА ССЫЛКА ...

Метод 1: Использование функции number_format (). Функция number_format () используется для преобразования строки в число. Он возвращает отформатированное число в случае успеха, иначе выдает E_WARNING в случае неудачи.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

Метод 2: Использование приведения типов: Приведение типов может напрямую преобразовать строку в тип с плавающей запятой, двойной или целочисленный примитивный тип. Это лучший способ преобразовать строку в число без какой-либо функции.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

Метод 3: Использование функций intval () и floatval (). Функции intval () и floatval () также можно использовать для преобразования строки в соответствующие ей целочисленные значения и значения с плавающей запятой соответственно.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

Метод 4: добавляя 0 или выполняя математические операции. Номер строки также можно преобразовать в целое число или число с плавающей запятой, добавив к строке 0. В PHP при выполнении математических операций строка неявно преобразуется в целое число или число с плавающей запятой.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
Манодж
источник