String PHP para flutuar

120

Não estou familiarizado com o PHP e fiz uma pergunta rápida.

Eu tenho 2 variáveis pricePerUnite InvoicedUnits. Este é o código que os define para valores:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

Se eu der a saída, obtenho os valores corretos. Vamos dizer 5000unidades faturadas e 1.00por preço.

Agora, preciso mostrar o valor total gasto. Quando eu multiplico esses dois juntos, não funciona (como esperado, são strings).

Mas não tenho ideia de como analisar / lançar / converter variáveis ​​em PHP.

O que devo fazer?

Nik
fonte

Respostas:

201
$rootbeer = (float) $InvoicedUnits;

Deve fazer isso por você. Verifique o malabarismo de tipos . Você também deve ler a conversão de String em Números .

Sampson
fonte
É o método mais simples .. mas ocasionalmente eu tenho problemas ao fazer isso com certas configurações de banco de dados e VARCHAR>11no comprimento .. não restringi exatamente o porquê ainda.
Talvi Watia
2
^ vale a pena notar que (float) remove 0 da string se for o primeiro dígito
Observe também que "11.000,00" produzirá 11 em vez dos 11.000,00 esperados
CodeJunkie
64

Você quer que a não-localidade ciente floatvalfunção :

float floatval (mixed $ var) - Obtém o valor float de uma string.

Exemplo:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343
Earino
fonte
4
parabéns por mencionar a consciência local. Acabei de passar 1,5h rastreando um problema causado por locais diferentes que causam (float)a conversão no primeiro servidor para "," e no segundo para ","
Dr. Gianluigi Zane Zanettini
23

Bem, se o usuário escrever 1,00.000, floatvar mostrará erro. Assim -

floatval(preg_replace("/[^-0-9\.]/","",$input));

Isso é muito mais confiável.

Uso:

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));
HADI
fonte
7
Em vez de ereg, use preg $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza
4
Sim, ereg, esta função foi DESCONTINUADA. Portanto, use preg em vez de ereg :)
HADI
9

Lidar com marcação em floats não é uma tarefa trivial. Na notação inglesa / americana, você formata mil mais 46*10-2:

1,000.46

Mas na Alemanha você mudaria a vírgula e o ponto:

1.000,46


Isso torna muito difícil adivinhar o número certo em aplicativos multilíngues.
Eu sugiro fortemente o uso Zend_Measuredo Zend Framework para esta tarefa. Este componente irá analisar a string para um valor flutuante pelo idioma do usuário.

Tobias P.
fonte
3
Hoje em dia (+3 anos), pode-se usar NumberFormatter a partir do PHP 5.3 com a intlextensão.
zamnuts
1
O PHP 5.3 estava disponível quando eu respondi à pergunta, mas até seu comentário eu não estava ciente dessa única função, pois existem dezenas de bibliotecas fazendo algo semelhante. Mas eles não terão uma cobertura tão boa de localidades como a extensão internacional tem. Obrigado, vou tentar me lembrar disso.
Tobias P.
1

Use esta função para converter um valor flutuante de qualquer tipo de estilo de texto:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

Esta solução não depende de nenhuma configuração local. Assim, para entrada do usuário, os usuários podem digitar valores flutuantes da maneira que quiserem. Isso é muito útil, por exemplo, quando você tem um projeto que está apenas em inglês, mas pessoas de todo o mundo estão usando e podem não ter em mente que o projeto quer um ponto em vez de uma vírgula para valores flutuantes. Você poderia jogar javascript na mistura e buscar as configurações padrão do navegador, mas ainda assim muitas pessoas definem esses valores para inglês, mas ainda digitando 1,25 em vez de 1,25 (especialmente, mas não limitado à indústria de tradução, pesquisa e TI)

Hafenkranich
fonte
algum comentário sobre por que isso é ruim / onde falha?
Hafenkranich
ou existe uma forma igualmente flexível e mais rápida?
Hafenkranich
1
Ele usa o sinalizador e, que "não é mais compatível". É meu palpite.
Leif
0

Eu estava tendo um problema com a maneira padrão de fazer isso:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

Se não houver um número válido, o analisador não deve retornar um número, ele deve gerar um erro. (Esta é uma condição que estou tentando detectar em meu código, YMMV)

Para corrigir isso, fiz o seguinte:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

Então, antes de continuar a processar a conversão, posso verificar e retornar um erro se não houver uma análise válida da string.

Morris Buel
fonte
0

Se você precisa lidar com valores que não podem ser convertidos separadamente, você pode usar este método:

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}
Jannie Theunissen
fonte
0

você pode seguir este link para saber mais sobre como converter uma string / número em número / float / decimal em PHP. AQUI ESTÁ O QUE ESTE LINK DIZ ...

Método 1: Usando a função number_format (). A função number_format () é usada para converter uma string em um número. Ele retorna o número formatado em caso de sucesso, caso contrário, dá E_WARNING em caso de falha.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

Método 2: Usando a conversão de tipos: A conversão de tipos pode converter diretamente uma string em um tipo primitivo flutuante, duplo ou inteiro. Esta é a melhor maneira de converter uma string em um número sem nenhuma função.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

Método 3: Usando as funções intval () e floatval (). As funções intval () e floatval () também podem ser usadas para converter a string em seus valores inteiros e float correspondentes, respectivamente.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

Método 4: Adicionando 0 ou executando operações matemáticas. O número da string também pode ser convertido em um inteiro ou flutuante adicionando 0 com a string. Em PHP, executando operações matemáticas, a string é convertida em um inteiro ou float implicitamente.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
Manoj
fonte