Observe que isso retornará uma tupla (se for bem-sucedido) e não o inteiro diretamente. Se você quiser fazer isso, veja @Szymon Jeż responder comString.to_integer/1
6
Existe alguma razão para usar Integer.parse/1mais String.to_integer/1?
Ian Vaughan
10
@IanVaughan Integer.parse/1retorna um :errorátomo se malsucedido. String.to_integer/1joga um (FunctionClauseError).
Jonathan Soifer
52
Além das funções Integer.parse/1e Float.parse/1que José sugeriu, você também pode verificar String.to_integer/1e String.to_float/1.
Dica: Veja também to_atom/1, to_char_list/1, to_existing_atom/1para outras conversões.
Isso gerará um erro se o val não for puramente um inteiro. Eu adicionei um caso ao resultado para garantir que a conversão foi bem-sucedida. A segunda cláusula pode ser genérica para catch: error ou uma segunda string não vazia, pois você não se importa muito se a entrada foi "x3" ou "3x".
Sinc
14
Existem 4 funções para criar um número a partir da string
String.to_integer, String.to_float
Integer.parse, Float.parse
String.to_integerfunciona bem, mas String.to_floaté mais difícil:
Como String.to_floatsó pode lidar com float bem formatado, por exemplo:, 1.0não 1(inteiro). Isso foi documentado no String.to_floatdoc de
Retorna um float cuja representação de texto é string.
string deve ser a representação de string de um float incluindo um ponto decimal. Para analisar uma string sem ponto decimal como um float, Float.parse / 1 deve ser usado. Caso contrário, um ArgumentError será gerado.
Mas Float.parseretorna uma tupla de 2 elementos, não o número que você deseja, então colocá-lo no pipeline não é "legal":
Como usar em funções? Minha melhor solução é aquela fn q -> {v, _} = Float.parse(q); v endque eu não gosto. Eu gosto de usar Enum.map, por exemplo, list |> Enum.map(&String.to_float/1)mas string.to_float não funciona para números inteiros?
Se você quiser converter uma string para qualquer tipo numérico que esteja dentro da string e remover todos os outros caracteres, isso provavelmente é um exagero, mas retornará um float se for um float ou um int se for um int ou nil se a string não contiver um tipo numérico.
String.to_integer/1
Integer.parse/1
maisString.to_integer/1
?Integer.parse/1
retorna um:error
átomo se malsucedido.String.to_integer/1
joga um(FunctionClauseError)
.Além das funções
Integer.parse/1
eFloat.parse/1
que José sugeriu, você também pode verificarString.to_integer/1
eString.to_float/1
.Dica: Veja também
to_atom/1
,to_char_list/1
,to_existing_atom/1
para outras conversões.fonte
Obrigado pessoal nesta página, apenas simplificando uma resposta aqui:
uma vez que valida que toda a string foi analisada (não apenas um prefixo).
fonte
Existem 4 funções para criar um número a partir da string
String.to_integer
funciona bem, masString.to_float
é mais difícil:Como
String.to_float
só pode lidar com float bem formatado, por exemplo:,1.0
não1
(inteiro). Isso foi documentado noString.to_float
doc deMas
Float.parse
retorna uma tupla de 2 elementos, não o número que você deseja, então colocá-lo no pipeline não é "legal":Usar
elem
para obter o primeiro elemento da tupla torna-o mais curto e mais doce:fonte
Você pode convertê-lo em um char_list e então usar o Erlang
to_integer/1
outo_float/1
.Por exemplo
fonte
fn q -> {v, _} = Float.parse(q); v end
que eu não gosto. Eu gosto de usarEnum.map
, por exemplo,list |> Enum.map(&String.to_float/1)
mas string.to_float não funciona para números inteiros?fonte
O problema de usar
Integer.parse/1
é que ele analisa qualquer parte não numérica da string, desde que esteja no final. Por exemplo:Da mesma forma,
String.to_integer/1
tem os seguintes resultados:Em vez disso, valide a string primeiro.
A expressão regular pode ser mais simples (por exemplo
^[0-9]*$
), dependendo do seu caso de uso.fonte
Se você quiser converter uma string para qualquer tipo numérico que esteja dentro da string e remover todos os outros caracteres, isso provavelmente é um exagero, mas retornará um float se for um float ou um int se for um int ou nil se a string não contiver um tipo numérico.
fonte