Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read integer in Erlang?

I'm trying to read user input of integer. (like cin >> nInput; in C++)
I found io:fread bif from http://www.erlang.org/doc/man/io.html, so I write code like this.

{ok, X} = io:fread("input : ", "~d"),
io:format("~p~n", [X]).

but when I input 10, the erlang terminal keep giving me "\n" not 10. I assume fread automatically read 10 and conert this into string. How can I read integer value directly? Is there any way to do this? Thank you for reading this.

like image 623
Sungwon Jeong Avatar asked Mar 27 '09 01:03

Sungwon Jeong


3 Answers

1> {ok, [X]} = io:fread("input : ", "~d").
input : 10
{ok,"\n"}
2> X.
10
3> {ok, [A,B]} = io:fread("input : ", "~d,~d").
input : 456,26
{ok,[456,26]}

That's all.

like image 192
Hynek -Pichi- Vychodil Avatar answered Nov 13 '22 14:11

Hynek -Pichi- Vychodil


There are various functions in OTP to help you convert a string to an integer. If you just read a string from the user (until newline for example) you can the evaluate it with the function to_integer(String) in the string module:

string:to_integer(String) -> {Int,Rest} | {error,Reason}

There is also the list_to_integer(String) BIF (Built-In Function, just call without a module) but it is not as forgiving as the string:to_integer(String) function:

list_to_integer(String) -> int()

You will get a badarg exception if the string does not contain an integer.

like image 30
Adam Lindberg Avatar answered Nov 13 '22 14:11

Adam Lindberg


If you use string:to_integer/1, check that the value of Rest is the empty list []. The function extracts the integer, if any, from the beginning of the string. It does not assure that the full input converts to an integer.

string:to_integer(String) -> {Int,Rest} | {error,Reason}

An example:

{Int, Rest} = string:to_integer("33t").
Int.  % -> 33
Rest. % -> "t"

Why check? If the user's finger slipped and hit 't' instead of 5, then the intended input was 335, not 33.

like image 29
Doug Edmunds Avatar answered Nov 13 '22 16:11

Doug Edmunds