PHP Рядок плаває


120

Я взагалі не знайомий з PHP і у мене було швидке запитання.

У мене є 2 змінні pricePerUnitі InvoicedUnits. Ось код, який встановлює ці значення:

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

Якщо вивести це, я отримаю правильні значення. Скажімо, 5000виставлені одиниці рахунків і 1.00за ціною

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

Але у мене немає поняття, як проаналізувати / відкинути / перетворити змінні в PHP.

Що я повинен зробити?

Відповіді:


201
$rootbeer = (float) $InvoicedUnits;

Слід зробити це за вас. Перевірте тип женглінгу . Ви також повинні прочитати перетворення рядків до чисел .


Це найпростіший метод .. але час від часу я стикався з проблемами, які роблять це з певними конфігураціями баз даних і VARCHAR>11по довжині .. ще не звузилися саме тому.
Talvi Watia

2
^ Варто зазначити, що (float) видаляє 0 із рядка, якщо це перша цифра

Також зауважте, що "11 000.00" виведе 11 замість очікуваних 11000.00
CodeJunkie

64

Ви хочете функцію, яка не знає floatvalлокалів :

float floatval (змішаний $ var) - отримує значення float рядка.

Приклад:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343

4
kudos для згадування локальної обізнаності. Я щойно витратив 1,5 години на відстеження проблеми, спричиненої різними локалями, що спричиняють (float)перетворення на першому сервері в ",", а на другому в ","
д-р Джанлуїджі Зейн Занеттіні

23

Ну, якщо користувач напише 1,00000, то floatvar покаже помилку. Так -

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

Це набагато надійніше.

Використання:

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

7
Замість ereg використовуйте preg $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza

4
Так, ereg, цю функцію було знято. Тому потрібно використовувати preg замість ereg :)
HADI

9

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

1,000.46

Але в Німеччині ви б змінили кому і крапку:

1.000,46


Це робить дійсно важким відгадати правильну кількість у багатомовних додатках.
Я настійно пропоную використовувати Zend_MeasureZend Framework для цього завдання. Цей компонент буде розбирати рядок до плаваючою мовою користувачів.


3
У наш час (+3 роки) можна було використовувати NumberFormatter, починаючи з PHP 5.3 з intlрозширенням.
замнуть

1
PHP 5.3 був доступний, коли я відповів на питання, але до вашого коментаря я не знав про цю єдину функцію, оскільки десятки бібліотек роблять щось подібне. Але вони не матимуть такого гарного покриття локалів, як розширення intl. Дякую, я спробую це запам'ятати.
Тобіас П.

1

Використовуйте цю функцію, щоб передати значення float з будь-якого стилю тексту:

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 (особливо, але не обмежуючись перекладацькою галуззю, науково-дослідними та інформаційними технологіями)


будь-які коментарі щодо того, чому це погано / де це не вдається?
Хафенкраніч,

чи є такий самий гнучкий спосіб, який швидше?
Хафенкраніч

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

Ви можете перейти за цим посиланням, щоб дізнатися більше про те, як перетворити рядок / число в число / float / decimal у 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: Використання кастингу типу: Typecasting може безпосередньо перетворити рядок у плаваючий, подвійний або цілочисельний примітивний тип. Це найкращий спосіб перетворити рядок у число без будь-якої функції.

// 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 () також можуть використовуватися для перетворення рядка у відповідні цілі чи знаки float відповідно.

// 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.