Zauważ, że zwróci to krotkę (jeśli się powiedzie), a nie bezpośrednio liczbę całkowitą. Jeśli chcesz to zrobić, zobacz odpowiedź @Szymon Jeż zString.to_integer/1
6
Czy jest jakiś powód, aby używać Integer.parse/1over String.to_integer/1?
Ian Vaughan,
10
@IanVaughan Integer.parse/1zwraca :erroratom, jeśli się nie powiedzie. String.to_integer/1rzuca (FunctionClauseError).
Jonathan Soifer,
52
Oprócz funkcji Integer.parse/1i, Float.parse/1które zasugerował José, możesz również sprawdzić String.to_integer/1i String.to_float/1.
Wskazówka: Patrz również to_atom/1, to_char_list/1, to_existing_atom/1dla innych konwersji.
Spowoduje to zgłoszenie błędu, jeśli val nie jest czystą liczbą całkowitą. Dodałem przypadek do wyniku, aby upewnić się, że konwersja się powiodła. Druga klauzula może być ogólna do wychwycenia: błąd lub niepusty drugi ciąg, ponieważ nie obchodzi cię, czy dane wejściowe to „x3” czy „3x”.
Sinc
14
Istnieją 4 funkcje do tworzenia liczby z łańcucha
String.to_integer, String.to_float
Integer.parse, Float.parse
String.to_integerdziała ładnie, ale String.to_floatjest twardszy:
Jak String.to_floatobsługuje tylko dobrze sformatowaną liczbę zmiennoprzecinkową, np .: 1.0, not 1(integer). To zostało udokumentowane w dokumencie String.to_float's
Zwraca liczbę zmiennoprzecinkową, której reprezentacją tekstową jest łańcuch.
ciąg musi być ciągiem reprezentującym wartość zmiennoprzecinkową, w tym kropką dziesiętną. Aby przeanalizować ciąg bez kropki dziesiętnej jako zmiennoprzecinkowy, należy użyć Float.parse / 1. W przeciwnym razie zostanie zgłoszony ArgumentError.
Ale Float.parsezwraca krotkę z 2 elementów, a nie żądaną liczbę, więc umieszczenie jej w potoku nie jest „fajne”:
Jak używać go w funkcjach? Moim najlepszym rozwiązaniem jest to, fn q -> {v, _} = Float.parse(q); v endco mi się nie podoba. Lubię go używać Enum.map, np. list |> Enum.map(&String.to_float/1)Ale string.to_float nie działa dla liczb całkowitych?
Jeśli chcesz przekonwertować ciąg na dowolny typ liczbowy w ciągu i usunąć wszystkie inne znaki, prawdopodobnie jest to przesada, ale zwróci wartość typu float, jeśli jest to float lub int, jeśli jest to int lub nil, jeśli łańcuch nie zawiera typ liczbowy.
String.to_integer/1
Integer.parse/1
overString.to_integer/1
?Integer.parse/1
zwraca:error
atom, jeśli się nie powiedzie.String.to_integer/1
rzuca(FunctionClauseError)
.Oprócz funkcji
Integer.parse/1
i,Float.parse/1
które zasugerował José, możesz również sprawdzićString.to_integer/1
iString.to_float/1
.Wskazówka: Patrz również
to_atom/1
,to_char_list/1
,to_existing_atom/1
dla innych konwersji.źródło
Dzięki ludziom na tej stronie, upraszczam odpowiedź tutaj:
ponieważ sprawdza, czy przeanalizowano cały ciąg (a nie tylko przedrostek).
źródło
Istnieją 4 funkcje do tworzenia liczby z łańcucha
String.to_integer
działa ładnie, aleString.to_float
jest twardszy:Jak
String.to_float
obsługuje tylko dobrze sformatowaną liczbę zmiennoprzecinkową, np .:1.0
, not1
(integer). To zostało udokumentowane w dokumencieString.to_float
'sAle
Float.parse
zwraca krotkę z 2 elementów, a nie żądaną liczbę, więc umieszczenie jej w potoku nie jest „fajne”:Użycie
elem
do pobrania pierwszego elementu z krotki sprawi, że będzie on krótszy i słodszy:źródło
Możesz przekonwertować go na char_list, a następnie użyć Erlang
to_integer/1
lubto_float/1
.Na przykład
źródło
fn q -> {v, _} = Float.parse(q); v end
co mi się nie podoba. Lubię go używaćEnum.map
, np.list |> Enum.map(&String.to_float/1)
Ale string.to_float nie działa dla liczb całkowitych?źródło
Problem z użyciem
Integer.parse/1
polega na tym, że sparsuje każdą nieliczbową część łańcucha, o ile znajduje się na końcu. Na przykład:Podobnie
String.to_integer/1
ma następujące wyniki:Zamiast tego najpierw sprawdź poprawność ciągu.
Wyrażenie regularne może być prostsze (np.
^[0-9]*$
) W zależności od przypadku użycia.źródło
Jeśli chcesz przekonwertować ciąg na dowolny typ liczbowy w ciągu i usunąć wszystkie inne znaki, prawdopodobnie jest to przesada, ale zwróci wartość typu float, jeśli jest to float lub int, jeśli jest to int lub nil, jeśli łańcuch nie zawiera typ liczbowy.
źródło