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


671

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

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545

63
Читатель, остерегайтесь: нет реального ответа на этот вопрос :(
Матье Наполи

@MatthieuNapoli Ответ заключается в том, что обычно Php выясняет это за вас - одно из преимуществ системы динамических типов.
Каньон Колоб

12
Со всеми цепочками неопределенности и «обычно».
персона 27

2
@MatthieuNapoli Как приведение типов не является "реальным ответом"? Вы даже можете проверить тип после типографской передачи, если хотите быть ребенком об этом
Каньон Колоб,

3
@MatthieuNapoli Я рад, что вы прояснили свою мысль о том, что существует более чем один способ снять шкуру с кошки, а не сделать это. Например, приведение очень важно в операциях с базой данных. Например, при параметризованном запросе PDO иногда анализатору будет сложно осознать, что это число, а не строка, а затем вы получите 0 в целочисленном поле, поскольку вы не приводили строку к целому числу. в шаге параметра.
stubsthewizard

Ответы:


1033

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

$num = "3.14";
$int = (int)$num;
$float = (float)$num;

4
здесь ситуация немного отличается, я хочу преобразовать любую строку (содержит только цифры) в общее число. Как U может знать в javaScript, мы можем использовать parseInt () для преобразования string => int или parseFloat () для преобразования string => float. но в целом javaScript использует Number () для преобразования string => number. Я хочу подобный метод в php?
Сара

4
Это было полезно для меня, когда у меня был номер месяца, полученный из полной строки даты, который я использовал для извлечения значения из массива имен моли. Автоматическое приведение здесь не происходит, потому что строковые индексы действительны, но не эквивалентны.
Казума Нии Кавальканти

19
В зависимости от контекста, может быть небезопасно предполагать, что .это разделитель десятичной точки. en.wikipedia.org/wiki/…
Дейв Джарвис,

3
@Sara: Вы также можете создать функцию для преобразования строки в число , сначала приведя ее к целому числу, затем к числу с плавающей точкой, а затем сравнив, если оба значения (целое и число с плавающей точкой) равны. Если они есть, вы должны вернуть значение как целое число, если нет, то как число с плавающей запятой. Надеюсь, вы поняли идею.
Юстай Иго

2
Есть моменты, когда вам нужно передать целое число в файловую систему, поэтому не стоит ждать, пока PHP выполнит преобразование за вас.
AaA

173

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

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

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

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

    $num = intval("10");
    $num = floatval("10.1");
  4. Использование settype().


9
Обратите внимание, что (double)это просто псевдоним для (float).
deceze

4
@ downvoter, я не знаю, что не так с моим ответом. Обратите внимание, что я разместил это до того, как ОП отредактировала ее вопрос, однако это также относится и к отредактированному вопросу ( $num = "10" + 1пример).
fardjad

2
@ ed-ta: уверен, что он вернет значение min / max вместо 0, если вы передадите ему строку. То есть intval("9999999999")==2147483647.
Рив

6
intvalполезно, потому что тогда вы можете использовать его, в array_map('intval', $arrayOfStrings);котором вы не можете делать с кастингом.
icc97

2
вместо $num = "10" + 1;этого лучше использовать, $num = "10" * 1;так как это не изменит значение (нейтральный элемент умножения), это, по сути, что-то вроде, toNumber(..)так как конечный тип будет определяться тем, что необходимо для преобразования строки «10» -> (int) 10; «10,1» -> (плавать) 10,1;
Холли

57

Чтобы избежать проблем, попробуйте 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
?>

4
ИМХО, это единственный правильный ответ, потому что он единственный, который учитывает основание числовой строки. Все ответы (даже те, которые предлагают пользовательскую функцию), которые просто используют приведение типа, потерпят неудачу, если числовая строка имеет один или несколько ведущих нулей, и строка НЕ ​​предназначена для представления числа с восьмеричным основанием.
Синтаксис наркомана

Любая идея, если я хочу конвертировать "12.7896" в 12.7896?
Агнес Палит

используйте floatval () для преобразования строки в число с плавающей точкой. floatval ("12.7896") вернется 12.7896
gopeca

Почему это не принятый ответ? Будучи аутсайдером PHP, я уже знал, что (int)$my_strэто не сработает, так как я имел дело именно со строковыми ссылками, 01и 013что я хочу интерпретировать как базу 10 ... Поэтому я хотел найти способ явно предоставить базу.
Джакомо Альзетта

48

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

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

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


35
Есть много языков, где вы не можете преобразовать строку в число, добавив ноль, обычно это считается ошибкой, а не допустимым методом преобразования :).
Ян Шпачек

4
honzasp прав, например, в JavaScript typeof('123'+0)дает 'string', потому что '123'+0дает '1230'.
Ориоль

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

Обратите внимание, что, добавляя ноль, вы не «кастуете» в истинном смысле, вы в основном конвертируете.
CSᵠ

12
@ oriol в javascript вам нужно добавить число к нулю, 0+'123'чтобы получить123
Тимо Хуовинен

24

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

(int)(your value);

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

intval(string)

Что делать, если введенный номер «2,3456», как я получу 2,3456?
Сара

6
вопрос тоже о поплавках.
taseenb

Покажите мне 1 строчку из OP, где написано float? перед тем, как пропустить комментарии и понизить голосование, посмотрите на оригинальный пост.
noobie-php

2
В примере показаны числа с плавающей запятой, в нем спрашивается, как преобразовать числовые строки в числовые значения (числа с плавающей запятой и целые числа)
taseenb

Сначала проверьте, является ли число с плавающей запятой is_float, и если это проходит, тогда приведите к с (float)вместо (int).
Мартин ван Дриэль

24

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

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

Это немного грязно, но это работает.


3
Возможно, менее грязный? strpos($val, '.') === false ? intval($val) : floatval($val);
июня

4
@jchook Возможно, более грязный, потому что он зависит от локали - например, «0,4» вместо «0,4».
Ник Райс

Хорошая точка зрения. Я полагаю, вы могли бы использовать localeconv()['decimal_point']вместо '.'. Одним из преимуществ strposрешения является то, что оно почти в 2 раза быстрее, чем сотворение.
jchook

2
@jchook, который разбивается на случаи, например 2.1e2, он имеет десятичную точку, но в результате получается целое число
Томаш

1
Просто используйте +оператор идентичности:, var_dump(+'0.4', +'4')дает вам с плавающей точкой и Int. php.net/manual/en/language.operators.arithmetic.php
tvanc

15

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

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

Я получил эту ошибку A non well formed numeric value encountered. Есть идеи?
Агнес Палит

15

Вместо того, чтобы выбрать , следует ли преобразовать 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;

13

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


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

13

Да, в PHP есть похожий метод, но он настолько мало известен, что о нем редко узнаешь. Это арифметический оператор называется " идентичность », как описано здесь:

Арифметические операторы

Чтобы преобразовать числовую строку в число, выполните следующие действия:

$a = +$a;

Предупреждение: взлом обнаружен.
Грег

Привет, Грег. Вы нажали на ссылку, размещенную здесь? Вот что разработчики сказали об этом операторе: преобразование $ a в int или float в зависимости от ситуации. «Преобразование» здесь не может быть понято как преобразование числа в число. Почему? Потому что с исключительной арифметической точки зрения этот оператор абсолютно бесполезен! Умножение любого числа на «+1» (эквивалент функции идентичности) абсолютно не влияет на него. Поэтому я не могу представить другую утилиту для этого оператора, кроме предлагаемого здесь преобразования типов.
aldemarcalazans

@ Грег - конечно, это меньше взломать, чем большинство других ответов. Это встроенный оператор, который делает именно то, что было запрошено. (Хотя его , вероятно , лучше сначала проверить is_numeric, так что есть место для размещения кода для обработки строк , которые не может преобразовать правильно.)
ToolmakerSteve

Я понимаю, что это прекрасно работает с использованием арифметического оператора для приведения, но это действительно легко пропустить. Я думаю, что стоит предупредить.
Грег

11

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

$a = "whatever"; // any variable

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

9

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

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;
    }
}

6

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

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

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


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") вернет строку

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

редактировать

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

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

6

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

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)


1
Это точка! :) Кстати, ваше решение намного лучше, чем все научные обозначения выше. Спасибо.
друг

это решение решило мою проблему. В моем случае $id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;вместо $ target_id_cron = (int) $ id_cron - 1;
inMILD

1
Я получил эту ошибку, A non well formed numeric value encounteredкогда я хочу изменить строку, чтобы плавать $num = '12,24' * 1. Любое предложение?
Агнес Палит

5
$a = "10";

$b = (int)$a;

Вы можете использовать это для преобразования строки в int в PHP .


2
если введено число «7,2345», я не могу использовать (int), тогда я должен использовать (float). Что мне нужно, это общее решение.
Сара

1
Вы всегда можете использовать double или float.
Притом

5

Просто вы можете написать так:

<?php
    $data = ["1","2","3","4","5"];
    echo json_encode($data, JSON_NUMERIC_CHECK);
?>

3
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
Алекс Рябов

1
Ты уверен насчет этого? Это не будет преобразовывать строку в число, а массив в строку JSON
Nico Haase

Да, @NicoHaase, если число в строковом формате в массиве, оно будет преобразовано в число.
Доминик Амаль Джо Ф

5

Умножьте число только на 1, чтобы строка была преобразована в число типа.

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}

Достаточно справедливо, но этот метод (и подобные приемы) уже перечислены в 24 других ответах на этот вопрос - я не вижу смысла публиковать его снова.
DavidW

4

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

((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;

2

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

$number = "1.234";

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

settype($number , "float");

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

По историческим причинам «двойник» возвращается в случае поплавка.

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";
}

1

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

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

   printf("%f\n", $num);
?>

Я не хочу этого говорить. Я хочу преобразовать его и сохранить в переменной.
Сара

1
Это автоматически преобразовало это в плавание. Свободное преобразование типов в PHP делает это за вас. Хотя это может не соответствовать вашим ожиданиям, другие ответы с явным преобразованием могут работать лучше для вас.
Адриан Корниш

$ str может содержать «5» или «5,258», используя printf («% f \ n», $ str) «5» будет выдано как 5,000000 (я хочу 5) для 5,280000 (я хочу 5,28), оно содержит больше десятичных знаков.
Сара

1

Есть выход:

$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);

Использование is_*не будет работать, так как variableэто:string .

Используя комбинацию json_encode()и затем json_decode()она преобразуется в «истинную» форму. Если это правда, stringто будет выводить неправильно.

$num = "Me";
$int = (int)$num;
$float = (float)$num;

var_dump($num, $int, $float);

Будет выводить: string(2) "Me" int(0) float(0)


0

У меня возник вопрос «скажем, вы писали встроенную функцию для преобразования целого числа в строку в PHP, как бы вы написали эту функцию» в интервью по программированию. Вот решение.

$nums = ["0","1","2","3","4","5","6","7","8","9"];
$int = 15939; 
$string = ""; 
while ($int) { 
    $string .= $nums[$int % 10]; 
    $int = (int)($int / 10); 
} 
$result = strrev($string);

0

Я перечитывал ответы и не видел, чтобы кто-нибудь упоминал самое большое предостережение в преобразовании чисел в PHP.

Наиболее одобренный ответ предлагает сделать следующее:

$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3

Это блестяще. PHP делает прямое приведение. Но что, если мы сделали следующее?

$str = "3.14is_trash"
$intstr = (int)$str

Считает ли PHP такие преобразования допустимыми?

Видимо да .

PHP читает строку, пока не найдет первый нечисловой символ для требуемого типа. Это означает, что для целых чисел числовые символы равны [0-9]. В результате он читает 3, так как он находится в диапазоне символов [0-9], он продолжает читать. Читает. и останавливается там, поскольку он не находится в диапазоне [0-9].

То же самое произошло бы, если бы вы бросили, чтобы плавать или удвоить PHP будет читать 3, затем ., затем 1, 4и останавливаться, iпоскольку это недопустимый числовой символ с плавающей точкой.

В результате "million" >= 1000000оценивается как ложное, но "1000000million" >= 1000000оценивается как true.

Смотрите также:

https://www.php.net/manual/en/language.operators.comparison.php, как выполняются преобразования при сравнении

https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion как строки преобразуются в соответствующие числа


0

Если вы заранее не знаете, есть ли у вас число с плавающей точкой или целое число,
и может ли строка содержать специальные символы (например, пробел, € и т. Д.),
И если она может содержать более 1 точки или запятой,
вы можете использовать это функция:

// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
    // return 0 if the string contains no number at all or is not a string:
    if (!is_string($string) || !preg_match('/\d/', $string)) {
        return 0;
    } 

    // Replace all ',' with '.':
    $workingString = str_replace(',', '.', $string);

    // Keep only number and '.':
    $workingString = preg_replace("/[^0-9.]+/", "", $workingString);

    // Split the integer part and the decimal part,
    // (and eventually a third part if there are more 
    //     than 1 decimal delimiter in the string):
    $explodedString = explode('.', $workingString, 3);

    if ($explodedString[0] === '') {
        // No number was present before the first decimal delimiter, 
        // so we assume it was meant to be a 0:
        $explodedString[0] = '0';
    } 

    if (sizeof($explodedString) === 1) {
        // No decimal delimiter was present in the string,
        // create a string representing an integer:
        $workingString = $explodedString[0];
    } else {
        // A decimal delimiter was present,
        // create a string representing a float:
        $workingString = $explodedString[0] . '.' .  $explodedString[1];
    }

    // Create a number from this now non-ambiguous string:
    $number = $workingString * 1;

    return $number;
}

-8

Другой подход:

  1. Вставьте все это в массив / ассоциативный массив.
  2. json_encode($your_array, JSON_NUMERIC_CHECK); при желании расшифровать его обратно
  3. ?
  4. Прибыль!

7
Переполнение стека - это ответы на вопросы, а не шутки. Я уверен, что для этого есть место, но это не так.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.