2013-05-16 24 views
8

Potrzebuję utworzyć ciąg, który zostanie wydrukowany później i nie może zawierać przecinka dziesiętnego. W tym celu próbuję użyć modułu io_lib: format w Erlangu, ale nie jestem pewien, jaki jest odpowiedni format, aby to osiągnąć.Jak sformatować zmienną erlang w liczbę całkowitą (bez kropki dziesiętnej)?

Na przykład, można użyć następujących do precyzji .1, ale nie .0

io_lib:format("~.2f", [789.1234]). 
789.12 

io_lib:format("~.1f", [789.1234]). 
789.1 

io_lib:format("~.0f", [789.1234]). 
** exception error: bad argument 
in function io_lib:format/2 
    called as io_lib:format("~.0f",[789.1234]) 

Potrzebuję tylko z:

  • 789.1234 wytwarzają ciąg „789 "

  • 123,0 wytwarzają ciąg "123"

Wiem, że mogę dokonać wymiany "re", ale staram się znaleźć elegancki sposób.

Odpowiedz

14
1> float_to_list(223.44456,[{decimals,0}]). 
"224" 

2> float_to_list(223.44456,[{decimals,6}]).   
"223.444560" 

3> float_to_list(223.44456,[{decimals,6},compact]).  
"223.44456" 

erlang:float_to_list/2

+0

Lubię to podejście i funkcji. Całkiem kompletny. – gextra

+0

Czy odpowiedź na nr 1 nie powinna wynosić 223? – JoshOfAllTrades

19

Jeśli obciąć liczbę zmiennoprzecinkową Erlang Stanie całkowitą. Poniżej znajduje się kod.

1> is_float(round(1.5)). 
false 
2> is_integer(round(1.5)). 
true 
3> is_float(trunc(1.5)).  
false 
4> is_integer(trunc(1.5)). 
true 
5> round(1.5).    
2 
6> trunc(1.5).    
1 
+0

'round (1.44445)' zwraca '1' w moim środowisku (Erlang R16B), a także na [Spróbuj Erlang] (http://www.tryerlang.org) online REPL. Nie polegałbym na tej funkcji. Ideone [wydaje się powracać] (http://ideone.com/yppCjM) ten sam wynik. –

+6

@YasirArsanukaev: co powinieneś zaokrąglić (1.44445) 'return if not' 1'? – legoscia

+1

Myślę, że to działałoby, ponieważ tworzenie z niego ciągu nie ujawnia żadnego separatora dziesiętnego: io_lib: format ("To jest liczba ~ p", [trunc (1.5)]). [84,104,105,115,32,105,115,32,110,117,109,98,101,114,32, "1"] – gextra

0

Aby przekonwertować na liczbę całkowitą można zrobić:

erlang:list_to_integer(erlang:float_to_list(789.1234,[{decimals,0}])). 

i jeśli chcesz zachować jak to jest w ciąg następnie

erlang:float_to_list(789.1234,[{decimals,0}]). 
Powiązane problemy