Tenga en cuenta que esto devolverá una tupla (si tiene éxito) y no el número entero directamente. Si quieres hacer eso, mira @Szymon Jeż responder conString.to_integer/1
6
¿Hay alguna razón para usar Integer.parse/1más String.to_integer/1?
Ian Vaughan
10
@IanVaughan Integer.parse/1devuelve un :errorátomo si no tiene éxito. String.to_integer/1lanza un (FunctionClauseError).
Jonathan Soifer
52
Además de las funciones Integer.parse/1y Float.parse/1que sugirió José, también puede verificar String.to_integer/1y String.to_float/1.
Sugerencia: Véase también to_atom/1, to_char_list/1, to_existing_atom/1para otras conversiones.
Esto arrojará un error si val no es puramente un entero. Agregué un caso en el resultado para asegurarme de que la conversión se realizó correctamente. La segunda cláusula puede ser genérica para capturar: error o una segunda cadena no vacía, ya que no le importa mucho si la entrada fue "x3" o "3x".
Sinc
14
Hay 4 funciones para crear un número a partir de una cadena
String.to_integer, String.to_float
Integer.parse, Float.parse
String.to_integerfunciona bien pero String.to_floates más difícil:
Como String.to_floatsolo puede manejar un flotante bien formateado, por ejemplo:, 1.0no 1(entero). Eso fue documentado en String.to_floatel documento de
Devuelve un flotante cuya representación de texto es una cadena.
cadena debe ser la representación de cadena de un flotante que incluya un punto decimal. Para analizar una cadena sin punto decimal como flotante, se debe usar Float.parse / 1. De lo contrario, se generará un ArgumentError.
Pero Float.parsedevuelve una tupla de 2 elementos, no el número que desea, por lo que ponerlo en canalización no es "genial":
¿Cómo usarlo en funciones? Mi mejor solución es la fn q -> {v, _} = Float.parse(q); v endque no me gusta. Me gusta usarlo Enum.map, por ejemplo, list |> Enum.map(&String.to_float/1)pero ¿string.to_float no funciona para números enteros?
Si desea convertir una cadena a cualquier tipo numérico que esté dentro de la cadena y eliminar todos los demás caracteres, esto probablemente sea excesivo, pero devolverá un flotante si es un flotante o un int si es un int o nil si la cadena no contiene un tipo numérico.
String.to_integer/1
Integer.parse/1
másString.to_integer/1
?Integer.parse/1
devuelve un:error
átomo si no tiene éxito.String.to_integer/1
lanza un(FunctionClauseError)
.Además de las funciones
Integer.parse/1
yFloat.parse/1
que sugirió José, también puede verificarString.to_integer/1
yString.to_float/1
.Sugerencia: Véase también
to_atom/1
,to_char_list/1
,to_existing_atom/1
para otras conversiones.fuente
Gracias a la gente de esta página, simplemente simplificando una respuesta aquí:
ya que valida que se analizó toda la cadena (no solo un prefijo).
fuente
Hay 4 funciones para crear un número a partir de una cadena
String.to_integer
funciona bien peroString.to_float
es más difícil:Como
String.to_float
solo puede manejar un flotante bien formateado, por ejemplo:,1.0
no1
(entero). Eso fue documentado enString.to_float
el documento dePero
Float.parse
devuelve una tupla de 2 elementos, no el número que desea, por lo que ponerlo en canalización no es "genial":Usar
elem
para obtener el primer elemento de la tupla lo hace más corto y dulce:fuente
Puede convertirlo a char_list y luego usar Erlang
to_integer/1
oto_float/1
.P.ej
fuente
fn q -> {v, _} = Float.parse(q); v end
que no me gusta. Me gusta usarloEnum.map
, por ejemplo,list |> Enum.map(&String.to_float/1)
pero ¿string.to_float no funciona para números enteros?fuente
El problema con el uso
Integer.parse/1
es que analizará cualquier parte no numérica de la cadena siempre que esté al final. Por ejemplo:Del mismo modo
String.to_integer/1
tiene los siguientes resultados:En su lugar, valide la cadena primero.
La expresión regular podría ser más simple (por ejemplo
^[0-9]*$
) dependiendo de su caso de uso.fuente
Si desea convertir una cadena a cualquier tipo numérico que esté dentro de la cadena y eliminar todos los demás caracteres, esto probablemente sea excesivo, pero devolverá un flotante si es un flotante o un int si es un int o nil si la cadena no contiene un tipo numérico.
fuente