我有一个外部API,它以下列格式将数字作为字符串返回
5e+24这意味着一个数字等于5 * 10^24,==> 5,有24个零。
长生不老药有能力将这些数字转换成整数吗?
这种格式到底叫什么?
发布于 2022-11-14 13:05:04
这有时被称为科学符号或E符号。
这些数字可以在Float.parse中从字符串解析为浮动。
iex> Float.parse "3.1e+4"
{31000.0, ""}
iex> Float.parse "5e+24"
{5.0e24, ""}正如您在上一个示例中所看到的,它返回E符号中的数字,但它仍然是可以使用的浮点数。
不过,要注意浮点类型所存在的所有缺陷。例如,如果您试图获得这个数字的一个很好的字符串表示形式,奇怪的事情会发生
{number, _} = Float.parse("5e+24")
Float.to_string number
# "5.0e24"
:erlang.float_to_binary number
# "5.00000000000000045298e+24"
:erlang.float_to_binary number, decimals: 0
"5000000000000000452984832"发布于 2022-11-14 14:04:22
您可以拆分字符串并自己将其相乘:
[a, b] = String.split("5e+24", "e+")
String.to_integer(a) * 10 ** String.to_integer(b)发布于 2022-11-14 14:20:07
zwippie的回答涉及浮点数,但正如他所提到的,浮标有一些问题。如果您想要一个纯粹的整数解决方案,我就找不到一种现有的方法,可以用科学的表示法将字符串解析为Elixir整数。您必须自己解析整数,例如,使用如下内容:
defmodule BigInteger do
def parse(s) do
{i, e} = Integer.parse(s)
e = String.downcase(e)
if not String.starts_with?(e, "e") do
{:error, "No \"e\""}
else
e = String.slice(e, 1..-1)
cond do
String.starts_with?(e, "+") ->
{exp, rest} = Integer.parse(String.slice(e, 1..-1))
if rest != "" do
IO.inspect(rest)
{:error, "Not integer after \"e+\""}
else
{:ok, i * Integer.pow(10, exp)}
end
True ->
{exp, rest} = Integer.parse(String.slice(e, 0..-1))
if rest != "" do
{:error, "Not integer after \"e\""}
else
{:ok, i * Integer.pow(10, exp)}
end
end
end
end
end
IO.inspect(BigInteger.parse("3e+24"))
IO.inspect(BigInteger.parse("4e24"))
IO.inspect(BigInteger.parse("5E24"))https://stackoverflow.com/questions/74431681
复制相似问题