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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With