Notez que cela renverra un tuple (en cas de succès) et non directement l'entier. Si vous voulez faire cela, voir @Szymon Jeż répondre avecString.to_integer/1
6
Y a-t-il une raison d'utiliser Integer.parse/1over String.to_integer/1?
Ian Vaughan
10
@IanVaughan Integer.parse/1renvoie un :erroratome en cas d'échec. String.to_integer/1jette un (FunctionClauseError).
Jonathan Soifer
52
En plus des fonctions Integer.parse/1et Float.parse/1que José a suggérées, vous pouvez également vérifier String.to_integer/1et String.to_float/1.
Conseil: Voir aussi to_atom/1, to_char_list/1, to_existing_atom/1pour d' autres conversions.
Cela lèvera une erreur si le val n'est pas purement un entier. J'ai ajouté un cas sur le résultat pour m'assurer que la conversion a réussi. La deuxième clause peut être générique pour attraper: erreur ou une deuxième chaîne non vide car vous ne vous souciez pas beaucoup de savoir si l'entrée était "x3" ou "3x".
Sinc le
14
Il y a 4 fonctions pour créer un nombre à partir d'une chaîne
String.to_integer, String.to_float
Integer.parse, Float.parse
String.to_integerfonctionne bien mais String.to_floatest plus dur:
Comme String.to_floatne peut gérer que des flottants bien formatés, par exemple:, 1.0not 1(entier). Cela a été documenté dans String.to_floatle doc
Renvoie un flottant dont la représentation textuelle est une chaîne.
string doit être la représentation sous forme de chaîne d'un flottant comprenant un point décimal. Afin d'analyser une chaîne sans virgule décimale comme un flottant, alors Float.parse / 1 doit être utilisé. Sinon, une ArgumentError sera déclenchée.
Mais Float.parseretourne un tuple de 2 éléments, pas le nombre que vous voulez, donc le mettre dans le pipeline n'est pas "cool":
Comment l'utiliser dans les fonctions? Ma meilleure solution est fn q -> {v, _} = Float.parse(q); v endque je n'aime pas. J'aime l'utiliser dans Enum.map, par exemple, list |> Enum.map(&String.to_float/1)mais string.to_float ne fonctionne pas pour les nombres entiers?
J'ai eu cette erreur: ** (UndefinedFunctionError) la fonction Decimal.new/1 n'est pas définie (le module Decimal n'est pas disponible)
Daniel Cukier
4
Le problème avec l'utilisation Integer.parse/1est qu'il analysera toute partie non numérique de la chaîne tant qu'elle se trouve à la fin. Par exemple:
Si vous vouliez convertir une chaîne en n'importe quel type numérique dans la chaîne et supprimer tous les autres caractères, c'est probablement exagéré, mais retournera un flottant si c'est un flottant ou un int si c'est un int ou nil si la chaîne ne contient pas un type numérique.
String.to_integer/1
Integer.parse/1
overString.to_integer/1
?Integer.parse/1
renvoie un:error
atome en cas d'échec.String.to_integer/1
jette un(FunctionClauseError)
.En plus des fonctions
Integer.parse/1
etFloat.parse/1
que José a suggérées, vous pouvez également vérifierString.to_integer/1
etString.to_float/1
.Conseil: Voir aussi
to_atom/1
,to_char_list/1
,to_existing_atom/1
pour d' autres conversions.la source
Merci à tous sur cette page, en simplifiant simplement une réponse ici:
car il valide que la chaîne entière a été analysée (pas seulement un préfixe).
la source
Il y a 4 fonctions pour créer un nombre à partir d'une chaîne
String.to_integer
fonctionne bien maisString.to_float
est plus dur:Comme
String.to_float
ne peut gérer que des flottants bien formatés, par exemple:,1.0
not1
(entier). Cela a été documenté dansString.to_float
le docMais
Float.parse
retourne un tuple de 2 éléments, pas le nombre que vous voulez, donc le mettre dans le pipeline n'est pas "cool":Utiliser
elem
pour obtenir le premier élément du tuple le rend plus court et plus doux:la source
Vous pouvez le convertir en char_list puis utiliser Erlang
to_integer/1
outo_float/1
.Par exemple
la source
fn q -> {v, _} = Float.parse(q); v end
que je n'aime pas. J'aime l'utiliser dansEnum.map
, par exemple,list |> Enum.map(&String.to_float/1)
mais string.to_float ne fonctionne pas pour les nombres entiers?la source
Le problème avec l'utilisation
Integer.parse/1
est qu'il analysera toute partie non numérique de la chaîne tant qu'elle se trouve à la fin. Par exemple:De même
String.to_integer/1
a les résultats suivants:Au lieu de cela, validez d'abord la chaîne.
L'expression régulière pourrait être plus simple (par exemple
^[0-9]*$
) en fonction de votre cas d'utilisation.la source
Si vous vouliez convertir une chaîne en n'importe quel type numérique dans la chaîne et supprimer tous les autres caractères, c'est probablement exagéré, mais retournera un flottant si c'est un flottant ou un int si c'est un int ou nil si la chaîne ne contient pas un type numérique.
la source