如何删除 Elixir/Phoenix 中小数点后的尾随零?
How to remove trailing zeros after decimal in Elixir/Phoenix?
我有一个数字列表(浮点数):[1.0, 3.0, 0.25, 0.125]
如何在 Phoenix 模板中格式化这些数字,使 1.0 和 3.0 分别显示为 1 和 3,而 0.25 和 0.125 则显示为原样。
请注意,这些数字来自数据库。
我无法通过 Google 搜索找到任何内容。
可能会使用 Kernel.round/1
和 Kernel.==/2
来检查浮点值是否实际上是一个整数。
Enum.map([1.0, 3.0, 0.25, 0.125], &if round(&1) == &1, do: round(&1), else: &1)
#⇒ [1, 3, 0.25, 0.125]
旁注: 这是一种非常罕见的情况,强制使用 ==
而不是严格 ===
.
当然,可以将所有内容都转换为字符串,然后将尾随 ~r/\.0+\z/
替换为空字符串,但我觉得这太笨拙了。
你可以使用 Decimal.reduce/1
:
Enum.map(
[1.0, 3.0, 0.25, 0.125],
&(&1 |> Decimal.from_float() |> Decimal.reduce() |> Decimal.to_string())
)
输出:
["1", "3", "0.25", "0.125"]
Decimal
不在标准库中,因此您需要将 {:decimal, "~> 1.0"}
添加到 mix.exs
。
我有一个数字列表(浮点数):[1.0, 3.0, 0.25, 0.125]
如何在 Phoenix 模板中格式化这些数字,使 1.0 和 3.0 分别显示为 1 和 3,而 0.25 和 0.125 则显示为原样。
请注意,这些数字来自数据库。
我无法通过 Google 搜索找到任何内容。
可能会使用 Kernel.round/1
和 Kernel.==/2
来检查浮点值是否实际上是一个整数。
Enum.map([1.0, 3.0, 0.25, 0.125], &if round(&1) == &1, do: round(&1), else: &1)
#⇒ [1, 3, 0.25, 0.125]
旁注: 这是一种非常罕见的情况,强制使用 ==
而不是严格 ===
.
当然,可以将所有内容都转换为字符串,然后将尾随 ~r/\.0+\z/
替换为空字符串,但我觉得这太笨拙了。
你可以使用 Decimal.reduce/1
:
Enum.map(
[1.0, 3.0, 0.25, 0.125],
&(&1 |> Decimal.from_float() |> Decimal.reduce() |> Decimal.to_string())
)
输出:
["1", "3", "0.25", "0.125"]
Decimal
不在标准库中,因此您需要将 {:decimal, "~> 1.0"}
添加到 mix.exs
。