Как мне преобразовать строку в число в PHP?

341

Я хочу преобразовать эти типы значений '3', '2.34', '0.234343' и т.д. в число. В JavaScript мы можем использовать Number(), но есть ли какой-либо подобный метод, доступный в PHP?

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545
  • 48
    Читатель, остерегайтесь: нет реального ответа на этот вопрос :(
  • 0
    @MatthieuNapoli Ответ в том, что обычно Php выясняет это за вас - одно из преимуществ системы динамических типов.
Показать ещё 4 комментария
Теги:
type-conversion

25 ответов

489
Лучший ответ

Обычно вам не нужно это делать, поскольку PHP в большинстве случаев будет принуждать вас к типу. В ситуациях, когда вы хотите явно преобразовать тип, cast:

$num = "3.14";
$int = (int)$num;
$float = (float)$num;
  • 3
    здесь ситуация немного отличается, я хочу преобразовать любую строку (содержит только цифры) в общее число. Как U может знать в javaScript, мы можем использовать parseInt () для преобразования string => int или parseFloat () для преобразования string => float. но в целом javaScript использует Number () для преобразования string => number. Я хочу подобный метод в php?
  • 1
    @sara AFAIK Для этого нет встроенной функции, вам нужно создать ее самостоятельно, которая, например, проверяет, есть ли . в строке, в этом случае вы бросаете его float . Но, опять же, это не нужно в большинстве случаев, строка будет работать очень хорошо.
Показать ещё 6 комментариев
91

Есть несколько способов сделать это:

  • Передача строк в числовые примитивные типы данных:

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
    
  • Выполните математические операции над строками:

    $num = "10" + 1;
    $num = floor("10.1");
    
  • Используйте intval() или floatval():

    $num = intval("10");
    $num = floatval("10.1");
    
  • Используйте settype().

  • 6
    Обратите внимание, что (double) это просто псевдоним для (float) .
  • 4
    @ downvoter, я не знаю, что не так с моим ответом. Обратите внимание, что я разместил это до того, как OP отредактировал ее вопрос, однако он также охватывает отредактированный вопрос (пример $num = "10" + 1 ).
Показать ещё 7 комментариев
45

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

Однако в этом очень мало смысла, поскольку PHP будет делать это автоматически во время использования этой переменной, и в любом случае он будет передан в строку во время вывода.

Обратите внимание, что вы можете захотеть сохранить точечные числа в виде строк, потому что после кастинга до плавания его можно непредсказуемо изменить из-за природы чисел с плавающей запятой.

  • 2
    идеально. Как раз то, что я хочу. добавление нуля решило мою проблему.
  • 33
    Есть много языков, где вы не можете преобразовать строку в число, добавив ноль, обычно это считается ошибкой, а не допустимым методом преобразования :).
Показать ещё 7 комментариев
24

Вы можете использовать:

(int)(your value);

Или вы можете использовать:

intval(string)
  • 0
    Что делать, если введенный номер «2,3456», как я получу 2,3456?
  • 5
    вопрос тоже о поплавках.
Показать ещё 3 комментария
18

Чтобы избежать проблем, попробуйте intval($var). Некоторые примеры:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34 (octal as starts with zero)
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26 (hex as starts with 0x)
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>
  • 3
    ИМХО, это единственный правильный ответ, потому что он единственный, который учитывает основание числовой строки. Все ответы (даже те, которые предлагают пользовательскую функцию), которые просто используют приведение типа, потерпят неудачу, если числовая строка имеет один или несколько ведущих нулей, и строка НЕ предназначена для представления числа с восьмеричным основанием.
16

Если вы хотите получить float для $value = '0.4', но int для $value = '4', вы можете написать:

$number = ($value == (int) $value) ? (int) $value : (float) $value;

Немного грязный, но он работает.

  • 2
    Возможно, менее грязный? strpos($val, '.') === false ? intval($val) : floatval($val);
  • 1
    @jchook Возможно, более грязный, потому что он зависит от локали - например, «0,4» вместо «0,4».
Показать ещё 1 комментарий
14

Например, вы можете использовать (int)_value_.

$string = '100';
$int = (int)$string;

См. Тип Жонглирование.

10

В PHP вы можете использовать функции intval(string) or floatval(string) для преобразования строк в числа.

  • 2
    нет, я хочу общий метод. это означает, что если его '5' => он должен конвертироваться в 5, а если его '2.345' =>, он должен конвертироваться в 2.345.
9

Небольшое примечание к ответам, которые могут быть полезными и безопасными в некоторых случаях. Вы можете проверить, действительно ли строка содержит действительное числовое значение и только затем преобразовать его в числовой тип (например, если вам нужно манипулировать данными, поступающими из db, который преобразует ints в строки). Вы можете использовать is_numeric(), а затем floatval():

$a = "whatever"; // any variable

if (is_numeric($a)) 
    var_dump(floatval($a)); // type is float
else 
    var_dump($a); // any type
8

Вместо того, чтобы выбирать погоду для преобразования string в int или float. Вы можете просто добавить к нему 0, и PHP автоматически преобразует результат в числовой тип.

// being sure the string is actually a number
if( is_numeric($string) )
    $number = $string + 0;
else // let the number be 0 if the string is not a number
    $number = 0;
7

Я обнаружил, что в JavaScript простой способ преобразования строки в число - это умножить ее на 1. Она разрешает проблему конкатенации, потому что символ "+" имеет множество применений в JavaScript, а "*" - символ является чисто математическим умножением.

Основываясь на том, что я видел здесь в отношении PHP, автоматически готов интерпретировать строку, содержащую цифру, в виде числа (и комментарии о добавлении, поскольку в PHP "+" используется исключительно для математического добавления), этот многократный трюк отлично работает и для PHP.

Я тестировал его, и он работает... Хотя в зависимости от того, как вы приобрели строку, вы можете применить к ней функцию trim(), прежде чем умножить на 1.

6

Вы всегда можете добавить к нему нуль!

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)
6

Вот функция, которую я написал для упрощения для себя:

Он также возвращает сокращенные версии логических, целых, двойных и реальных.

function type($mixed, $parseNumeric = false)
{        
    if ($parseNumeric && is_numeric($mixed)) {
        //Set type to relevant numeric format
        $mixed += 0;
    }
    $t = gettype($mixed);
    switch($t) {
        case 'boolean': return 'bool'; //shorthand
        case 'integer': return 'int';  //shorthand
        case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
        default: return $t;
    }
}

Тип вызова с parseNumeric, установленным в true, преобразует числовые строки перед проверкой типа.

Таким образом:

type ( "5", true) вернет int

type ( "3.7", true) вернет float

type ( "500" ) вернет строку

Просто будьте осторожны, поскольку это своего рода метод ложной проверки, и ваша фактическая переменная все равно будет строкой. При необходимости вам нужно будет преобразовать действительную переменную в правильный тип. Мне просто нужно было проверить, должна ли база данных загружать идентификатор элемента или псевдоним, поэтому никаких неожиданных эффектов не будет, поскольку в любом случае он будет разбираться как строка во время выполнения.

Edit

Если вы хотите определить, являются ли объекты функциями, добавьте этот случай к коммутатору:

case 'object': return is_callable($mixed)?'function':'object';
4

В дополнение к Boykodev ответ я предлагаю следующее:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)
  • 0
    Подумав немного, я также могу предложить разделить на 1 :)
  • 1
    Это точка! :) Кстати, ваше решение намного лучше, чем все научные обозначения выше. Спасибо.
Показать ещё 2 комментария
4
    $num = "3.14";
    $int = (int)$num; // output = 3
    $float = (float)$num; // output = 3.14
    $double = (double)$num; // output = 3.14

вы можете преобразовать строку в число в PHP с помощью cast.

4

Попробуйте использовать что-то вроде этого:

<?php
$string='5';// $ string is a variable to hold string '5'
$int=intval($string);// $int is the converted string to integer  $int=intval('5');
echo$int;//5
?>
4
$a = "10";

$b = (int)$a;

Вы можете использовать это, чтобы преобразовать строку в int в PHP.

  • 1
    если введенное число «7,2345», я не могу использовать (int), тогда я должен использовать (float). Что мне нужно, это общее решение.
  • 1
    Вы всегда можете использовать double или float.
Показать ещё 1 комментарий
3

Вот функция, которая достигает того, что вы ищете. Сначала мы проверяем, можно ли понимать значение как число, если это так, мы превратим его в int и float. Если int и float одинаковы (например, 5 == 5.0), мы возвращаем значение int. Если int и float не совпадают (например, 5!= 5.3), то мы предполагаем, что вам нужна точность float и вернуть это значение. Если значение не является числовым, мы бросаем предупреждение и возвращаем значение null.

function toNumber($val) {
    if (is_numeric($val)) {
        $int = (int)$val;
        $float = (float)$val;

        $val = ($int == $float) ? $int : $float;
        return $val;
    } else {
        trigger_error("Cannot cast $val to a number", E_USER_WARNING);
        return null;
    }
}
3

В вашем конкретном случае вы можете просто умножить на 1, чтобы преобразовать строку в число в php. PHP автоматически обрабатывает плавающее и целое число.

$num = "2.12";
var_dump(is_float($num)); //bool(false)
var_dump(is_int($num)); //bool(false)
var_dump(is_string($num)); //bool(true)

$num = $num*1;
var_dump(is_float($num)); //bool(true)
var_dump(is_int($num)); //bool(false)
var_dump(is_string($num)); //bool(false)
3

Вы можете использовать:

((int) $var)   ( but in big number it return 2147483647 :-) )

Но лучшим решением является использование:

if (is_numeric($var))
    $var = (isset($var)) ? $var : 0;
else
    $var = 0;

или

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;
3

Вы можете изменить тип данных следующим образом

$number = "1.234";

echo gettype ($number) . "\n"; //Returns string

settype($number , "float");

echo gettype ($number) . "\n"; //Returns float

По историческим причинам "double" возвращается в случае поплавка.

Документация по PHP

2

все предложения освобождают числовой тип это кажется мне лучшей практикой

function str2num($s){
//returns a num or FALSE
    $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
    print "\nret=$return_value type=".gettype($return_value)."\n";
}
2

PHP сделает это за вас в пределах

<?php
   $str="3.148";
   $num=$str;

   printf("%f\n", $num);
?>
  • 0
    Я не хочу этого говорить. Я хочу преобразовать его и сохранить в переменной.
  • 1
    Это автоматически преобразовало это в плавание. Свободное преобразование типов в PHP делает это за вас. Хотя это может не соответствовать вашим ожиданиям, другие ответы с явным преобразованием могут работать лучше для вас.
Показать ещё 1 комментарий
-2

Разный подход:

  • вставьте все это в массив/ассоциативный массив.
  • json_encode($your_array, JSON_NUMERIC_CHECK ); возможно декодировать его обратно
  • прибыль!
  • 6
    Переполнение стека связано с ответами на вопросы, а не с шутками. Я уверен, что для этого есть место, но это не так.
  • 0
    Что, черт возьми это?! Downvote!
-3
$a = "7.2345";
$b = round(((float)$a),0);
  • 6
    объясните свой ответ более подробно, написав заявления о решении

Ещё вопросы

Сообщество Overcoder
Наверх
Меню