it-swarm.dev

Jak převedu řetězec na číslo v PHP?

Chci převést tyto typy hodnot, '3', '2.34', '0.234343' atd. Na číslo. V JavaScriptu můžeme použít Number(), ale existuje nějaká podobná metoda dostupná v PHP?

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545
517
Sara

Nemusíte to obvykle dělat, protože PHP bude ve většině případů nutit tento typ. V situacích, kdy chcete explicitně převést typ, cast it:

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

Existuje několik způsobů, jak to provést:

  1. Obsazení řetězců na číselné primitivní datové typy:

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
    
  2. Proveďte matematické operace na řetězcích:

    $num = "10" + 1;
    $num = floor("10.1");
    
  3. Použít intval() nebo floatval() :

    $num = intval("10");
    $num = floatval("10.1");
    
  4. Použít settype() .

130
fardjad

V jakémkoli (volně psaném) jazyce můžete vždy vložit řetězec na číslo přidáním nuly.

Nicméně, v tomto smyslu je velmi malý smysl, protože PHP to udělá automaticky v době použití této proměnné a bude stejně jako v době výstupu odlit do řetězce.

Všimněte si, že můžete chtít ponechat tečkovaná čísla jako řetězce, protože po odlévání může být změněna nepředvídatelně, kvůli povaze floatových čísel.

45
Your Common Sense

Aby se předešlo problémům, zkuste intval($var) . Nějaké příklady:

<?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
?>
38
gopeca

Můžeš použít:

(int)(your value);

Nebo můžete použít:

intval(string)
22
noobie-php

Pokud chcete získat float pro $value = '0.4', ale int pro $value = '4', můžete napsat:

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

Je to trochu špinavé, ale funguje to.

17

Můžete použít například (int)_value_.

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

Viz Typ žonglování .

14
Elbert Labasano

Místo toho, abyste museli zvolit, zda chcete převést string na int nebo float, můžete k ní jednoduše přidat 0 a PHP automaticky převede výsledek na číselný typ.

// 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;
12
webNeat

Můžete k tomu vždy přidat nulu!

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

V PHP můžete použít intval(string) or floatval(string) funkce pro převod řetězců na čísla.

11
Kashif Khan

Je to jen malá poznámka k odpovědím, které mohou být v některých případech užitečné a bezpečnější. Možná budete chtít zkontrolovat, zda řetězec skutečně obsahuje nejprve platnou číselnou hodnotu a teprve potom jej převést na číselný typ (například pokud musíte manipulovat s daty přicházejícími z db, která převádí ints na řetězce). Můžete použít is_numeric() a pak floatval():

$a = "whatever"; // any variable

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

Zde je funkce, která dosahuje toho, co hledáte. Nejprve zkontrolujeme, zda lze hodnotu chápat jako číslo, pokud ji převedeme na int a float. Pokud int a float jsou stejné (např. 5 == 5,0), pak vrátíme hodnotu int. Pokud int a float nejsou stejné (např. 5! = 5.3), pak předpokládáme, že potřebujete přesnost float a vrátit tuto hodnotu. Pokud hodnota není číselná, zahodíme varování a návratovou hodnotu 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;
    }
}
8

Zde je funkce, kterou jsem napsal pro zjednodušení věcí pro sebe:

Vrací také zkrácené verze boolean, integer, double a 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;
    }
}

Volání typu s parametrem parseNumeric nastaveným na hodnotu true převede číselné řetězce před kontrolou typu.

Tím pádem:

typu ("5", true) vrátí int

typu ("3.7", true) vrátí float

typu ("500") vrátí řetězec

Buďte opatrní, protože se jedná o způsob falešné kontroly a vaše skutečná proměnná bude stále řetězec. V případě potřeby budete muset převést aktuální proměnnou na správný typ. Jen jsem potřeboval, abych zkontroloval, zda má databáze načíst ID položky nebo alias, takže nemá žádné neočekávané efekty, protože bude stejně analyzován jako řetězec.

Upravit

Pokud chcete zjistit, zda se jedná o funkce, přidejte tento případ do přepínače:

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

Kromě Boykodevovy odpovědi doporučuji toto:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)
6
drugan
    $num = "3.14";
    $int = (int)$num; // Output = 3
    $float = (float)$num; // Output = 3.14
    $double = (double)$num; // Output = 3.14

Řetězec můžete převést na číslo v PHP pomocí obsazení.

6
Sandun Harshana

Zjistil jsem, že v JavaScriptu je jednoduchý způsob, jak převést řetězec na číslo, násobit číslem 1. Řeší problém zřetězení, protože symbol "+" má v JavaScriptu více použití, zatímco symbol "*" je čistě pro matematické násobení.

Na základě toho, co jsem zde viděl v souvislosti s PHP automaticky ochotným interpretovat řetězec obsahující číslice jako číslo (a komentáře týkající se přidávání, protože v souboru PHP je čistě pro matematické sčítání), tento násobný trik funguje dobře i pro PHP.

Zkoušel jsem to a funguje to ... Ačkoli v závislosti na tom, jak jste řetězec získali, můžete na něj použít funkci trim (), než vynásobíte hodnotou 1.

6

Jednoduše můžete napsat takto:

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

Funkci intval() / můžete jednoduše použít k převodu řetězce na int.

5
Codemaker

Ano, v PHP existuje podobná metoda, ale je tak málo známo, že o tom budete jen zřídka slyšet. Je to aritmetický operátor nazvaný " identita ", jak je popsáno zde:

Aritmetické operátory

Chcete-li převést číselný řetězec na číslo, postupujte takto:

$a = +$a;
5
aldemarcalazans
$a = "10";

$b = (int)$a;

To lze použít k převodu řetězce na int v PHP .

4
Pritom

Zkuste použít něco takového:

<?php
    $string = '5'; // The $ 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
Nikhil Jaitak

Můžeš použít:

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

Ale nejlepším řešením je použít:

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

Nebo

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;
4
Mehdi Ajdari

PHP to udělá za vás v mezích

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

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

Typ dat můžete změnit následujícím způsobem

$number = "1.234";

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

settype($number , "float");

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

Z historických důvodů se v případě plováku vrací „double“.

PHP Dokumentace

2
David Lozano

Pro váš konkrétní případ, můžete jen vynásobit 1 převést řetězec na číslo v PHP. PHP se automaticky stará o plovoucí a celé číslo.

$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)
2
Haktan Suren

Všechny návrhy ztratí numerický typ.

Zdá se mi to jako nejlepší postup:

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
Rocco Galasso

Dostal jsem otázku "říkám, že jste psali vestavěnou funkci pro obsazení celého čísla na řetězec v PHP, jak byste tuto funkci napsali" v programovacím rozhovoru. Tady je řešení.

$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
Brendan

Existuje způsob:

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

Použití is_* nebude fungovat, protože variable je a: string.

Použití kombinace json_encode() a pak json_decode() je převedeno na "pravou" formu. Pokud je to pravda string, pak by to bylo špatné.

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

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

Bude na výstupu: string(2) "Me" int(0) float(0)

0
Anuga