如何删除 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/1Kernel.==/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