Beachten Sie, dass dies ein Tupel (falls erfolgreich) und nicht die Ganzzahl direkt zurückgibt. Wenn Sie das tun möchten, sehen Sie @Szymon Jeż Antwort mitString.to_integer/1
6
Gibt es einen Grund zu verwenden , Integer.parse/1über String.to_integer/1?
Ian Vaughan
10
@IanVaughan Integer.parse/1gibt ein :errorAtom zurück, wenn dies nicht erfolgreich ist. String.to_integer/1wirft a (FunctionClauseError).
Jonathan Soifer
52
Zusätzlich zu den Integer.parse/1und Float.parse/1Funktionen, die José vorgeschlagen hat, können Sie auch String.to_integer/1und überprüfen String.to_float/1.
Hinweis: Siehe auch to_atom/1, to_char_list/1, to_existing_atom/1für andere Konvertierungen.
Dies löst einen Fehler aus, wenn der Wert keine reine Ganzzahl ist. Ich habe dem Ergebnis einen Fall hinzugefügt, um sicherzustellen, dass die Konvertierung erfolgreich war. Die zweite Klausel kann generisch sein, um zu fangen: Fehler oder eine nicht leere zweite Zeichenfolge, da es Ihnen egal ist, ob die Eingabe "x3" oder "3x" war.
Seit dem
14
Es gibt 4 Funktionen zum Erstellen einer Nummer aus einer Zeichenfolge
String.to_integer, String.to_float
Integer.parse, Float.parse
String.to_integerfunktioniert gut, String.to_floatist aber härter:
Da String.to_floatkann nur gut formatiertes Float verarbeitet werden, zB: 1.0nicht 1(Integer). Das wurde in String.to_float's doc dokumentiert
Gibt einen Float zurück, dessen Textdarstellung eine Zeichenfolge ist.
Zeichenfolge muss die Zeichenfolgendarstellung eines Gleitkommas einschließlich eines Dezimalpunkts sein. Um eine Zeichenfolge ohne Dezimalpunkt als Gleitkomma zu analysieren, sollte Float.parse / 1 verwendet werden. Andernfalls wird ein ArgumentError ausgelöst.
Aber Float.parsegibt ein Tupel von zwei Elementen, nicht die Zahl , die Sie wollen, es so in Pipeline setzen ist nicht „cool“:
Wie benutzt man es in Funktionen? Meine beste Lösung ist fn q -> {v, _} = Float.parse(q); v enddie, die ich nicht mag. Ich benutze es gerne in Enum.map, zB list |> Enum.map(&String.to_float/1)aber string.to_float funktioniert nicht für Ganzzahlen?
Ich habe diesen Fehler erhalten: ** (UndefinedFunctionError) -Funktion Decimal.new/1 ist undefiniert (Modul Decimal ist nicht verfügbar)
Daniel Cukier
4
Das Problem bei der Verwendung Integer.parse/1besteht darin, dass alle nicht numerischen Teile der Zeichenfolge analysiert werden, solange sie sich am hinteren Ende befinden. Beispielsweise:
Wenn Sie eine Zeichenfolge in einen beliebigen numerischen Typ innerhalb der Zeichenfolge konvertieren und alle anderen Zeichen entfernen möchten, ist dies wahrscheinlich ein Overkill, gibt jedoch einen Gleitkommawert zurück, wenn es sich um einen Gleitkommawert handelt, oder einen Int, wenn es sich um einen Int handelt, oder einen Nullwert, wenn der String nicht enthält ein numerischer Typ.
String.to_integer/1
Integer.parse/1
überString.to_integer/1
?Integer.parse/1
gibt ein:error
Atom zurück, wenn dies nicht erfolgreich ist.String.to_integer/1
wirft a(FunctionClauseError)
.Zusätzlich zu den
Integer.parse/1
undFloat.parse/1
Funktionen, die José vorgeschlagen hat, können Sie auchString.to_integer/1
und überprüfenString.to_float/1
.Hinweis: Siehe auch
to_atom/1
,to_char_list/1
,to_existing_atom/1
für andere Konvertierungen.quelle
Vielen Dank Leute auf dieser Seite, die hier nur eine Antwort vereinfachen:
da es bestätigt, dass die gesamte Zeichenfolge analysiert wurde (nicht nur ein Präfix).
quelle
Es gibt 4 Funktionen zum Erstellen einer Nummer aus einer Zeichenfolge
String.to_integer
funktioniert gut,String.to_float
ist aber härter:Da
String.to_float
kann nur gut formatiertes Float verarbeitet werden, zB:1.0
nicht1
(Integer). Das wurde inString.to_float
's doc dokumentiertAber
Float.parse
gibt ein Tupel von zwei Elementen, nicht die Zahl , die Sie wollen, es so in Pipeline setzen ist nicht „cool“:Verwenden Sie
elem
, um das erste Element aus dem Tupel zu erhalten, und machen Sie es kürzer und süßer:quelle
Sie können es in eine char_list konvertieren und dann Erlang
to_integer/1
oder verwendento_float/1
.Z.B
quelle
fn q -> {v, _} = Float.parse(q); v end
die, die ich nicht mag. Ich benutze es gerne inEnum.map
, zBlist |> Enum.map(&String.to_float/1)
aber string.to_float funktioniert nicht für Ganzzahlen?quelle
Das Problem bei der Verwendung
Integer.parse/1
besteht darin, dass alle nicht numerischen Teile der Zeichenfolge analysiert werden, solange sie sich am hinteren Ende befinden. Beispielsweise:Ebenso
String.to_integer/1
hat die folgenden Ergebnisse:Überprüfen Sie stattdessen zuerst die Zeichenfolge.
Der reguläre Ausdruck kann
^[0-9]*$
je nach Anwendungsfall einfacher sein (z. B. ).quelle
Wenn Sie eine Zeichenfolge in einen beliebigen numerischen Typ innerhalb der Zeichenfolge konvertieren und alle anderen Zeichen entfernen möchten, ist dies wahrscheinlich ein Overkill, gibt jedoch einen Gleitkommawert zurück, wenn es sich um einen Gleitkommawert handelt, oder einen Int, wenn es sich um einen Int handelt, oder einen Nullwert, wenn der String nicht enthält ein numerischer Typ.
quelle