Como faço para converter uma string em um número em PHP?


669

Eu quero converter esses tipos de valores, '3', '2.34', '0.234343', etc, para um número. Em JavaScript, podemos usar Number(), mas existe algum método semelhante disponível em PHP?

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

63
Leitor tenha cuidado: não há verdadeira resposta a esta pergunta :(
Matthieu Napoli

@MatthieuNapoli A resposta é que geralmente o Php descobre isso para você - uma das vantagens de um sistema de tipos dinâmicos.
Canyon Kolob

12
Com todas as cadeias de incerteza e 'normalmente'.
person27

2
@MatthieuNapoli Como a conversão de tipo não é uma "resposta real"? Você pode até mesmo verificar o tipo depois de estereotipado, se você quer ser um bebê sobre isso
Kolob Canyon

3
@ MatthieuNapoli Fico feliz que você tenha esclarecido seu ponto de vista, pois significa que há mais de uma maneira de esfolar um gato, em vez de não haver maneira de fazer isso. A transmissão é muito importante nas operações do banco de dados, por exemplo. Por exemplo, em uma consulta PDO parametrizada, às vezes haverá uma dificuldade para o analisador perceber que é um número e não uma sequência e, em seguida, você termina com um 0 em um campo inteiro porque não converteu a sequência em um int na etapa do parâmetro.
stubsthewizard

Respostas:


1032

Você normalmente não precisa fazer isso, pois o PHP coagirá o tipo para você na maioria das circunstâncias. Para situações em que você deseja converter explicitamente o tipo, lançou -lo:

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

4
aqui a situação é um pouco diferente. Quero converter qualquer string (contém apenas números) em um número geral. Como você pode saber em javaScript, podemos usar parseInt () para converter string => int ou parseFloat () para converter string => float. mas em geral o javaScript usa Number () para converter string => number. Eu quero um método semelhante em php?
Sara

4
Foi útil para mim quando obtive um número de mês obtido a partir de uma sequência de datas completa, que costumava extrair um valor de uma matriz de nomes de traças. A transmissão automática não ocorre aqui porque os índices de sequência são válidos, mas não equivalentes.
Cazuma Nii Cavalcanti

19
Dependendo do contexto, pode não ser seguro assumir que esse .é o separador de ponto decimal. pt.wikipedia.org/wiki/…
Dave Jarvis

3
@ Sara: Você também pode criar uma função para converter a string em número , lançando-a primeiro em número inteiro, depois para flutuar e comparando se os dois valores (número inteiro e número flutuante) são iguais. Se forem, você deve retornar o valor como inteiro, se não, como flutuante. Espero que você entenda a idéia.
Youstay Igo

2
Há momentos em que você precisa passar o número inteiro para o sistema de arquivos, não é uma boa ideia esperar o PHP fazer a conversão para você.
AaA

173

Existem algumas maneiras de fazer isso:

  1. Transmitir as strings para tipos de dados numéricos primitivos:

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
  2. Execute operações matemáticas nas seqüências de caracteres:

    $num = "10" + 1;
    $num = floor("10.1");
  3. Use intval()ou floatval():

    $num = intval("10");
    $num = floatval("10.1");
  4. Use settype().


9
Observe que (double)é apenas um alias para (float).
deceze

4
@ downvoter, não sei o que há de errado com a minha resposta. Observe que eu postei isso antes da OP ter editado a pergunta dela, mas isso também abrange a questão editada ( $num = "10" + 1exemplo).
Fardjad

2
@ ed-ta: tenho certeza de que retornaria o valor min / max em vez de 0 se você passar as strings para ele. Ou seja intval("9999999999")==2147483647.
riv

6
intvalé útil porque você pode usá-lo no array_map('intval', $arrayOfStrings);qual não pode fazer a transmissão.
icc97

2
em vez de $num = "10" + 1;ser melhor usar, $num = "10" * 1;uma vez que isso não altera o valor (elemento neutro da multiplicação), isso é basicamente algo semelhante, toNumber(..)já que o tipo final será determinado pelo que é necessário para converter a string "10" -> (int) 10; "10,1" -> (flutuante) 10,1;
Holly

57

Para evitar problemas, tente intval($var) . Alguns exemplos:

<?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
IMHO, esta é a única resposta correta, porque é a única que leva em consideração a raiz da sequência numérica. Todas as respostas (mesmo as que sugerem uma função definida pelo usuário) que simplesmente usam uma conversão de tipo falharão se a sequência numérica tiver um ou mais zeros à esquerda e a sequência NÃO for destinada como um número com base octal.
Junta Sintaxe

alguma idéia se eu quiser converter "12.7896" para 12.7896?
Agnes Palit

use floatval () para converter uma string em um float. floatval ("12.7896") retornará 12.7896
gopeca 29/11/19

Por que essa não é a resposta aceita? Como um outsider do PHP, eu já sabia que (int)$my_strisso não funcionaria, pois estava lidando especificamente com strings liks 01e 013que eu queria interpretar como base 10 ... Então, eu queria uma maneira de fornecer explicitamente a base.
Giacomo Alzetta

48

Em qualquer idioma (de tipo fraco), você sempre pode converter uma string em um número adicionando zero a ela.

No entanto, há muito pouco sentido nisso, pois o PHP fará isso automaticamente no momento do uso dessa variável e será convertido para uma string de qualquer maneira no momento da saída.

Observe que você pode manter os números pontilhados como seqüências de caracteres, porque após a conversão para flutuação, ela pode ser alterada imprevisivelmente, devido à natureza dos números flutuantes.


35
Existem muitos idiomas em que você não pode converter uma string em número adicionando zero, geralmente é considerado um erro, e não um método válido de conversão :).
Jan Špaček

4
honzasp está certo, por exemplo, em JavaScript typeof('123'+0)'string', porque '123'+0'1230'.
Oriol

5
Observe que, no PHP, recomenda-se que na maioria das vezes você use comparações de estilos ===. Então, se você vai estar comparando seus dados pode ser muito importante que tipo ela é armazenada no.
Jonathon

Observe que, ao adicionar um zero, você não está 'transmitindo' no verdadeiro sentido, basicamente está convertendo.
CS

12
@oriol em javascript você precisa adicionar o número a zero 0+'123'para obter123
Timo Huovinen

24

Você pode usar:

(int)(your value);

Ou você pode usar:

intval(string)

e se o número digitado for '2.3456', como obtenho 2.3456?
Sara

6
a questão também é sobre carros alegóricos.
taseenb

Mostre-me uma linha do OP, onde diz float? antes de passar comentários e votos negativos, veja a postagem original.
noobie-php

2
O exemplo mostra flutuadores, que está pedindo como converter cadeias numéricas em valores numéricos (flutuadores e inteiros)
taseenb

Primeiro, verifique se o número é um float com is_floate, se isso passar, depois converta para with em (float)vez de (int).
Martin van Driel

24

Se você deseja obter um float para $value = '0.4', mas int for $value = '4', você pode escrever:

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

Está um pouco sujo, mas funciona.


3
Possivelmente menos sujo? strpos($val, '.') === false ? intval($val) : floatval($val);
jchook

4
@jchook Possivelmente mais sujo porque depende da localidade - por exemplo, '0,4' em vez de '0,4'.
Nick Rice,

Bom ponto. Suponho que você poderia usar em localeconv()['decimal_point']vez de '.'. Uma vantagem da strpossolução é que ela é quase duas vezes mais rápida que a transmissão duas vezes.
jchook

2
@jchook que quebra em casos como 2.1e2, tem ponto decimal, mas o número resultante é inteiro #
Tomáš Blatný

1
Basta usar o +operador de identidade:, var_dump(+'0.4', +'4')fornece um float e um int. php.net/manual/en/language.operators.arithmetic.php
tvanc

15

Você sempre pode adicionar zero a ele!

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

Eu recebi esse erro A non well formed numeric value encountered. qualquer ideia?
Agnes Palit

15

Em vez de escolher entre converter stringpara intou float, você pode simplesmente adicionar um 0a ele, e o PHP converterá automaticamente o resultado em um tipo numérico.

// 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

No PHP, você pode usar intval(string) or floatval(string)funções para converter seqüências de caracteres em números.


4
não, eu quero um método comum. o que significa que se '5' => ele deve converter para 5 e se '2,345' => deve ser convertido para 2,345.
Sara

13

Sim, existe um método semelhante no PHP, mas é tão pouco conhecido que você raramente ouvirá sobre ele. É um operador aritmético chamado " identidade ", conforme descrito aqui:

Operadores aritméticos

Para converter uma sequência numérica em um número, faça o seguinte:

$a = +$a;

Aviso: hack detectado.
Greg

Oi @Greg. Você clicou no link postado aqui? Isto é o que os desenvolvedores disseram sobre esse operador: Conversão de $ a para int ou float, conforme apropriado. "Conversão", aqui, não pode ser entendida como uma conversão de número para número. Por quê? Porque, de um ponto de vista aritmético exclusivo, este operador é absolutamente inútil! Multiplicar qualquer número por "+1" (o equivalente à função de identidade) não tem absolutamente nenhum efeito sobre ele. Portanto, não consigo imaginar outro utilitário para esse operador além da conversão de tipo sugerida aqui.
Aldemarcalazans

@ Greg - certamente isso é menos um hack, do que a maioria das outras respostas. É um operador interno, que faz exatamente o que foi solicitado. (Embora provavelmente o seu melhor primeiro cheque is_numeric, para ter um lugar para colocar código para cordas identificador que não pode converter corretamente.)
ToolmakerSteve

Entendo que funciona perfeitamente para usar um operador aritmético para fundição, mas é realmente fácil perder. Eu acho que vale um aviso.
Greg

11

Apenas uma pequena nota para as respostas que podem ser úteis e seguras em alguns casos. Convém verificar se a string realmente contém um valor numérico válido primeiro e somente depois convertê-lo em um tipo numérico (por exemplo, se você precisar manipular dados provenientes de um banco de dados que converte ints em strings). Você pode usar is_numeric()e depois floatval():

$a = "whatever"; // any variable

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

9

Aqui está a função que alcança o que você está procurando. Primeiro, verificamos se o valor pode ser entendido como um número; nesse caso, o transformamos em int e float. Se int e float forem os mesmos (por exemplo, 5 == 5.0), retornaremos o valor int. Se int e float não forem os mesmos (por exemplo, 5! = 5,3), assumimos que você precisa da precisão do float e retornamos esse valor. Se o valor não for numérico, lançamos um aviso e retornamos nulo.

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

Descobri que no JavaScript uma maneira simples de converter uma string em um número é multiplicá-la por 1. Ele resolve o problema de concatenação, porque o símbolo "+" tem vários usos em JavaScript, enquanto o símbolo "*" é puramente para multiplicação matemática.

Com base no que eu vi aqui sobre o PHP automaticamente querer interpretar uma string contendo dígitos como um número (e os comentários sobre a adição, já que no PHP o "+" é apenas para adição matemática), esse truque de multiplicação funciona muito bem para PHP também.

Eu testei e funciona ... Embora, dependendo de como você adquiriu a string, você pode aplicar a função trim () a ela, antes de multiplicar por 1.


6

Aqui está uma função que escrevi para simplificar as coisas para mim:

Ele também retorna versões abreviadas de booleano, inteiro, duplo e 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;
    }
}

O tipo de chamada com parseNumeric definido como true converterá seqüências numéricas antes de verificar o tipo.

Portanto:

type ("5", true) retornará int

type ("3.7", true) retornará float

type ("500") retornará string

Apenas tome cuidado, pois esse é um tipo de método de verificação falsa e sua variável real ainda será uma string. Você precisará converter a variável real para o tipo correto, se necessário. Eu só precisava verificar se o banco de dados deveria carregar um ID ou um alias de item, sem causar efeitos inesperados, pois ele será analisado como uma string no tempo de execução.

Editar

Se você deseja detectar se objetos são funções, adicione este caso ao comutador:

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

6

Além da resposta de Boykodev, sugiro o seguinte:

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

Depois de pensar sobre isso um pouco, eu também pode sugerir a divisão por 1 :)
Boykodev

1
Isso é um ponto! :) A propósito, sua solução é muito melhor do que todas as anotações científicas acima. Obrigado.
Drugan

esta solução resolveu meu problema. No meu caso, em $id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;vez de $ target_id_cron = (int) $ id_cron - 1;
inMILD

1
Eu recebi esse erro A non well formed numeric value encounteredquando quero alterar a string para flutuar $num = '12,24' * 1. Alguma sugestão?
Agnes Palit

5
$a = "10";

$b = (int)$a;

Você pode usar isso para converter uma string em um int no PHP .


2
se o número digitado for '7.2345', não posso usar (int), tenho que usar (flutuar). O que eu preciso é de uma solução geral.
Sara

1
Você sempre pode usar double ou float.
Pritom

5

Simplesmente você pode escrever assim:

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

3
Embora esse código possa responder à pergunta, fornecer um contexto adicional a respeito de por que e / ou como esse código responde à pergunta melhora seu valor a longo prazo.
Alex Riabov 28/08/18

1
Você tem certeza disso? Isso não converterá uma string em um número, mas uma matriz em uma string JSON
Nico Haase

Sim, @NicoHaase se o número estiver no formato de string em uma matriz, ele será convertido em um número.
Dominic Amal Joe F

5

Apenas multiplique o número por 1 para que a string seja convertida em número do tipo.

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

É justo, mas esse método (e truques semelhantes) já estão listados nas 24 outras respostas a esta pergunta - não vejo o valor em publicá-lo novamente.
19419 DavidW:

4

Você pode usar:

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

Mas a melhor solução é usar:

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

Ou

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

2

Você pode alterar o tipo de dados da seguinte maneira

$number = "1.234";

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

settype($number , "float");

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

Por razões históricas, "double" é retornado em caso de flutuação.

Documentação PHP


2

Todas as sugestões perdem o tipo numérico.

Isso me parece uma prática recomendada:

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 fará isso por você dentro de limites

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

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

Eu não quero colocar isso para fora. Eu quero convertê-lo e salvá-lo em uma variável.
Sara

1
Isso automaticamente o converteu em um flutuador. A conversão de tipos soltos do PHP faz isso por você. Embora possa não fazer o que você espera, as outras respostas com conversão explícita podem funcionar melhor para você.
Adrian Cornish

$ str can contém '5' ou '5.258' usando printf ("% f \ n", $ str) '5' será colocado como 5.000000 (eu quero como 5) por 5.280000 (eu quero como 5.28) mais pontos decimais.
Sara

1

Há uma maneira:

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

Usar is_*não funcionará, pois o variableé um:string .

Usando a combinação de json_encode()e, em seguida, json_decode()ele é convertido em sua forma "verdadeira". Se é verdade, stringentão seria errado.

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

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

Saída: string(2) "Me" int(0) float(0)


0

Eu recebi a pergunta "digamos que você estava escrevendo a função interna para converter um número inteiro em uma string no PHP, como você escreveria essa função" em uma entrevista de programação. Aqui está uma solução.

$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

Eu tenho lido as respostas e não vi ninguém mencionar a maior ressalva na conversão de números do PHP.

A resposta mais votada sugere fazer o seguinte:

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

Isso é brilhante. PHP faz casting direto. Mas e se fizermos o seguinte?

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

O PHP considera válidas essas conversões?

Aparentemente sim .

O PHP lê a string até encontrar o primeiro caractere não numérico para o tipo necessário. Significando que para números inteiros, os caracteres numéricos são [0-9]. Como resultado, ele lê 3, como está no intervalo de [0-9] caracteres, continua lendo. Lê .e para por aí, pois não está no intervalo [0-9].

O mesmo aconteceria se você jogasse para flutuar ou dobrar. O PHP leria 3, então ., então 1, então 4, e parava, ipois não é um caractere numérico flutuante válido.

Como resultado, "million" >= 1000000avalia como falso, mas "1000000million" >= 1000000avalia como true.

Veja também:

https://www.php.net/manual/en/language.operators.comparison.php como as conversões são feitas ao comparar

https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion como as strings são convertidas nos respectivos números


0

Se você não souber antecipadamente se possui um número flutuante ou um número inteiro
e se a sequência pode conter caracteres especiais (como espaço, €, etc),
e se pode conter mais de 1 ponto ou vírgula,
você pode usá-lo função:

// 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

Abordagem diferente:

  1. Coloque tudo em uma matriz / matriz associativa.
  2. json_encode($your_array, JSON_NUMERIC_CHECK); opcionalmente decodificá-lo de volta
  3. ?
  4. Lucro!

7
O estouro de pilha é sobre respostas a perguntas, não piadas. Tenho certeza de que existe um lugar para isso, mas esse lugar não é.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.