2015-09-16 2 views
30

Sto lavorando su una funzione di formattazione del prezzo, che prende un float e lo rappresenta correttamente.Perché non riesco a Chain String.replace?

ex. 190.5, dovrebbe essere 190,50

Questo è ciò che si avvicinò con

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

se corro quanto segue.

format_price(299.0) 
# -> 299,0 

sembra che correva solo attraverso la prima sostituzione. Ora se cambio questo al seguente.

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

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

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

Quindi tutto sembra funzionare bene.

format_price(299.0) 
# -> 299,00 

Perché è questo?

+4

In generale (per coloro che potrebbero leggere più avanti) quando si mettono in discussione gli argomenti tramite le funzioni, assicurarsi di mettere le parentesi attorno agli argomenti. –

risposta

28

EDIT Sul ramo master di Elixir, il compilatore avviserà se una funzione viene convogliata in pipe senza parentesi se ci sono argomenti.


questo è un problema di precedenza che può essere fissato con staffe esplicite:

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

Perché chiamate di funzione hanno una priorità più alta rispetto all'operatore |> il codice è lo stesso:

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

che se sostituiamo l'ultima clausola:

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

E ancora:

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

dovrebbe spiegare il motivo per cui si ottiene questo risultato.

+0

@Gazler, hai un link al commit che introduce la modifica? – asymmetric

+1

@asymmetric https://github.com/elixir-lang/elixir/commit/3487d00ddb5e90c7cf0e65d03717903b9b27eafd – Gazler