Як перетворити рядок у число в PHP?


670

Я хочу , щоб перетворити ці типи значень, '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 у цілому полі, оскільки ви не передали рядок до int на етапі параметра.
впертий майстер

Відповіді:


1031

Звичайно цього не потрібно робити, оскільки PHP примушує тип для вас у більшості випадків. У ситуаціях, коли ви хочете явно перетворити тип, надішліть його:

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

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

4
Для мене це було корисно, коли у мене був номер місяця, отриманий із повного рядка дати, з якого я витягував значення з масиву назв молі. Автоматичне кастинг тут не відбувається, оскільки строкові індекси дійсні, але не еквівалентні.
Cazuma Nii Cavalcanti

19
Залежно від контексту, може бути небезпечним вважати, що .це роздільник десяткових знаків. en.wikipedia.org/wiki/…
Дейв Джарвіс

3
@Sara: Ви також можете створити функцію для перетворення рядка в число , спершу відкинувши його до цілого числа, потім до плаваючого, а потім порівнявши, якщо обидва значення (ціле число і плаваючий) рівні. Якщо вони є, ви повинні повернути значення як ціле число, якщо ні, то як float. Сподіваюсь, ви зрозуміли ідею.
Youstay Igo

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).
деге

4
@downvoter, я не знаю, що не так у моїй відповіді. Зауважте, що я розміщував це перед тим, як ОП відредагував її питання, однак це стосується і відредагованого питання ( $num = "10" + 1приклад).
fardjad

2
@ ed-ta: майже впевнений, що він поверне значення min / max замість 0, якщо ви передасте йому рядки. Тобто intval("9999999999")==2147483647.
riv

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
ІМХО, це єдина правильна відповідь, оскільки це єдина, яка враховує радіус числового рядка. Усі відповіді (навіть ті, що пропонують визначену користувачем функцію), які просто використовують тип передачі, будуть невдалими, якщо числовий рядок має одну або більше провідних нулів, а рядок НЕ призначений як число з восьмеричною базою.
Syntax Junkie

будь-яка ідея, якщо я хочу перетворити "12.7896" в 12.7896?
Агнес

використовувати floatval () для перетворення рядка в float. 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 рекомендується більшу частину часу використовувати порівняння стилів ===. Тож якщо ви будете порівнювати свої дані, може бути дуже важливим, у якому типі вони зберігаються.
Jonathon

Зауважте, що додавши нуль, який ви не «відкидаєте» в справжньому сенсі, ви в основному конвертуєте.
CSᵠ

12
@oriol у javascript потрібно додати число до нуля, 0+'123'щоб отримати123
Timo Huovinen

24

Ви можете використовувати:

(int)(your value);

Або ви можете використовувати:

intval(string)

що робити, якщо введене число "2.3456", як я отримаю 2.3456?
Сара

6
питання також про поплавці.
taseenb

Покажіть мені 1 рядок від ОП, де написано плавати? перш ніж пройти коментарі та знизити голоси, подивіться на Original Post.
noobie-php

2
На прикладі показано floats, він запитує, як перетворити числові рядки в числові значення (
floats і integers

Спочатку перевірте, чи число є плаваючою is_float, а якщо це переходить, то передати на, (float)а не з (int).
Мартін ван Дріел

24

Якщо ви хочете отримати float для $value = '0.4', але int for $value = '4', ви можете написати:

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

Він трохи брудний, але працює.


3
Можливо, менш брудним? strpos($val, '.') === false ? intval($val) : floatval($val);
jchook

4
@jchook Можливо, брудніше, оскільки це залежить від локальності - наприклад, "0,4" замість "0,4".
Нік Райс

Гарна думка. Я гадаю, ви можете використовувати localeconv()['decimal_point']замість цього '.'. Однією з переваг strposрішення є те, що це майже в 2 рази швидше, ніж кастинг двічі.
jchook

2
@jchook, який розбивається на такі випадки 2.1e2, має десяткову точку, але отримане число є цілим числом
Tomáš Blatný

1
Просто скористайтеся +оператором ідентифікації:, var_dump(+'0.4', +'4')дає вам float та 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;

Попередження: хак виявлений.
Грег

Привіт @Greg. Ви натискали на посилання, розміщене тут? Це те, що розробники сказали про цього оператора: Перетворення $ a в int або float, як це доречно. "Перетворення" тут не можна розуміти як перетворення число в число. Чому? Тому що з ексклюзивної арифметичної точки зору цей оператор абсолютно марний! Множення будь-якого числа на "+1" (еквівалент функції ідентичності) абсолютно не впливає на це. Тому я не можу уявити іншої утиліти для цього оператора, ніж запропонована тут конверсія типів.
aldemarcalazans

@Greg - це, звичайно, менше хаку, ніж більшість інших відповідей. Це вбудований оператор, який робить саме те, що було просити. (Хоча його , ймовірно , краще спочатку перевірити is_numeric, так що є місце для розміщення коду для обробки рядків , які не може перетворити правильно.)
ToolmakerSteve

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

11

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

9

Ось функція, яка досягає того, що ви шукаєте. Спочатку ми перевіряємо, чи можна значення розуміти як число, якщо так, ми перетворюємо його на 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;
    }
}

6

Я виявив, що в JavaScript простий спосіб перетворення рядка в число - це його множення на 1. Це вирішує проблему конкатенації, оскільки символ "+" має багато разів використовувати в JavaScript, тоді як символ "*" - суто для математичного множення.

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

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


6

Ось функція, яку я написав для спрощення речей для себе:

Він також повертає скорочені версії boolean, integer, double та real.

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", правда) повернеться з плаванням

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 :)
Бойкодев

1
Це справа! :) До речі, ваше рішення набагато краще, ніж усі наукові позначення вище. Дякую.
drugan

це рішення вирішило мою проблему. У моєму випадку $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
Ніко Хааз

Так, @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.comppare.php, як здійснюються конверсії при порівнянні

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


0

Якщо ви не знаєте заздалегідь, чи є у вас float або ціле число,
і якщо рядок може містити спеціальні символи (наприклад, пробіл, € тощо),
і якщо він може містити більше 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.