elixir - 我正在尝试对长生不老药中的输入数据执行数学运算,但它会引发算术错误
问题描述
我是 elixir 的新手,在这种情况下,我正在尝试对收到的数据执行数学运算,计算从用户那里获得的薪水的十分之一并抛出此错误:
** (ArithmeticError) bad argument in arithmetic expression
m.ex:11: M.calc/0*
这是我的代码
def calc do
salary = IO.gets("What is your salary?") |> String.trim
x = salary
IO.puts "Your tithe this month is: #{(x * 0.01)}"
end
解决方案
你得到这个错误的原因是它IO.gets
会给你二进制文件(例如字符串)。您可以做一件事来检查您收到的内容是使用IO.inspect(salary)
它可能应该产生类似的东西
"1000\n"
因此,您可能需要删除\n
然后解析。您可以使用删除String.replace/4
您可能还需要删除包含的任何特殊字符(例如$
)。
然后,当您拥有数字本身时,您可以使用String.to_integer/1
或String.to_float/1
解析数字,具体取决于您期望的是整数还是浮点值。
一个基本的工作版本可能是:
defmodule M do
def main do
calc()
end
def calc do
salary =
IO.gets("What is your salary?")
|> String.trim()
|> String.replace("\n", "")
|> String.to_integer()
IO.puts "Your tithe this month is: #{salary * 0.01}"
end
end
假设数字总是整数。但是,当然,您可以添加更多逻辑来解决这两个问题。
您也可以使用Integer.parse/2
andFloat.parse
代替,这可能有助于删除其他字符,例如:
defmodule M do
def main do
calc()
end
def calc do
{salary, _other_chars} =
IO.gets("What is your salary?")
|> Float.parse()
IO.puts "Your tithe this month is: #{salary * 0.01}"
end
end
它可能是一个更好、更通用的函数,但它总是会产生一个浮点数
推荐阅读
- qt5 - 对象之间的 Qt 信号导致锁定
- swift - 快速从音频文件中删除音频通道
- android - Android 使用 Google Play .der 证书编译 APK(无密码保护)
- typescript - JSON解析期间的Typescript自动类型转换?
- elasticsearch - Elasticsearch 使字段成为数组
- powershell - Azure Devops 发布管道中的参数块问题
- html - Ruby on Rails 模型,日历栏作为列,不同模型的主键作为行?
- entity-framework - 2 列中最新日期的 LINQ 匹配
- python - 如何在 python 3 中打印/获取 Html 文件中的特定行
- python - 解析 .txt 文件中的关键字然后寻找子关键字?