我是Erlang初学者,我正在尝试制作一个简单的命令行应用程序,用户输入地板的宽度和高度,每平方英尺地板的成本,并返回一个价格。基本上我只是接受三个整数值并返回产品。
23> c(costcalc).
{ok,costcalc}
24> costcalc:start().
Calculate the cost of flooring based on width, height, and cost per square foot.
Width in feet: 5
Height in feet: 5
Cost in dollars per square foot: $4
** exception error: an error occurred when evaluating an arithmetic expression in function costcalc:start/0 (costcalc.erl, line 23)
以下是我正在使用的代码:
start() ->
io:format("Calculate the cost of flooring based on width, height, and cost per square foot.\n"),
W = string:to_integer(io:get_line("Width in feet: ")),
H = string:to_integer(io:get_line("Height in feet: ")),
C = string:to_integer(io:get_line("Cost in dollars per square foot: $")),
Cost = W * H * C,
io:fwrite(Cost).
第23行是Cost = W * H * C,
,应该是100.当我直接在shell中运行5 * 5 * 4.
时,它会毫无问题地计算。我还应该注意到,无论我是否使用string:to_integer(),我都会想到我可以在没有它的情况下使用它。
我错过了什么?
答案 0 :(得分:2)
正如@Khashayar所提到的,代码中的问题是string:to_integer/1
返回一对(具有两个元素的元组),整数是第一个元素。
但是,您不应该使用此功能。 Erlang中的字符串只是一个整数列表,您打算使用的是list_to_integer/1
。这是将字符串转换为整数的常用方法。
如果您使用list_to_integer/1
,您可以避免@ Khashayar代码中的第二对元素与任何内容匹配的错误。实际上,您可以输入以下内容:
Calculate the cost of flooring based on width, height, and cost per square foot.
Width in feet: 1.9
Height in feet: 1.9
Cost in dollars per square foot: $ 4.9
4
虽然1.9*1.9*4.9
实际上等于17.689
。
不幸的是,没有list_to_number/1
函数会返回整数或浮点数。处理此问题的最常见方法是使用list_to_float/1
执行try / catch并回退到list_to_integer/1
。或者,您可以使用不会引发异常的io_lib:fread/2
或string:to_float/1
(仍然如上所述,使用string:to_float/1
被视为不良做法)。
答案 1 :(得分:1)
你遇到的问题是string:to_integer,它返回2个值!你应该像这样使用它们。
start() ->
io:format("Calculate the cost of flooring based on width, height, and cost per square foot.\n"),
{W,_} = string:to_integer(io:get_line("Width in feet: ")),
{H,_} = string:to_integer(io:get_line("Height in feet: ")),
{C,_} = string:to_integer(io:get_line("Cost in dollars per square foot: $ ")),
Cost = (W * H) * C,
io:fwrite("~p~n",[Cost]).
顺便说一句,第二个值是字符串的其余部分,
to_integer(String) - > {Int,Rest} | {错误,原因}
祝你好运