¿Por qué no puedo encadenar String.replace?

Estoy trabajando en una función de formato de precio, que toma un flotante y la represento correctamente.

ex. 190.5, debe ser 190,50

Esto es lo que se me ocurrió

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

Si ejecuto lo siguiente.

format_price(299.0)
# -> 299,0

Parece que solo pasó por el primer reemplazo. Ahora si cambio esto a lo siguiente.

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

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

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

Entonces todo parece funcionar bien.

format_price(299.0)
# -> 299,00

¿Por qué es esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta