【问题标题】:Why can't I chain String.replace?为什么我不能链接 String.replace?
【发布时间】:2015-12-13 10:39:48
【问题描述】:

我正在研究一个价格格式函数,它接受一个浮点数,并正确地表示它。

例如。 190.5,应该是 190,50

这是我想出来的

  def format_price(price) do
    price
    |> to_string
    |> String.replace ".", ","
    |> String.replace ~r/,(\d)$/, ",\\1 0"
    |> String.replace " ", ""
  end

如果我运行以下命令。

format_price(299.0)
# -> 299,0

看起来它只运行了第一次替换。现在,如果我将其更改为以下内容。

  def format_price(price) do
    formatted = price
    |> to_string
    |> String.replace ".", ","

    formatted = formatted
    |> String.replace ~r/,(\d)$/, ",\\1 0"

    formatted = formatted
    |> String.replace " ", ""
  end

然后一切似乎都很好。

format_price(299.0)
# -> 299,00

这是为什么?

【问题讨论】:

  • 一般来说(对于那些稍后可能会阅读此内容的人),当您通过函数传递参数时,请确保在参数周围加上括号。

标签: elixir


【解决方案1】:

EDIT 在 Elixir 的 master 分支上,如果有参数,编译器会警告如果一个函数被不带括号的管道输入。


这是一个优先级问题,可以用明确的括号来解决:

price
|> to_string
|> String.replace(".", ",")
|> String.replace(~r/,(\d)$/, ",\\1 0")
|> String.replace(" ", "")

由于函数调用的优先级高于|> 运算符,因此您的代码与以下代码相同:

price
|> to_string
|> String.replace(".",
  ("," |> String.replace ~r/,(\d)$/,
    (",\\1 0" |> String.replace " ", "")))

如果我们替换最后一个子句:

price
|> to_string
|> String.replace(".",
  ("," |> String.replace ~r/,(\d)$/, ".\\10"))

再说一遍:

price
|> to_string
|> String.replace(".", ",")

应该解释为什么你会得到这个结果。

【讨论】:

猜你喜欢
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2014-03-22
  • 1970-01-01
  • 2023-03-03
  • 2012-02-02
相关资源
最近更新 更多