2009-10-13 11 views
27

Korzystanie następujący fragment kodu:Haskell: Siła płynie mieć dwie dziesiętne

(fromIntegral 100)/10.00 

Korzystanie z Haskell '98 standardowego preludium, jak mogę reprezentować wynik z dwóch miejsc po przecinku?

Dzięki.

+0

To ma być reprezentowany jako ciąg znaków. To znaczy. 10,00. – Anders

Odpowiedz

51

Tak dla przypomnienia:

import Numeric 
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum "" 
+9

IMO ta odpowiedź powinna być zaakceptowana. –

+0

@NikitaVolkov Zrobione. Lepiej późno niż wcale ;-) – Anders

22

Można użyć printf :: PrintfType r => String -> r z Text.Printf:

Prelude> import Text.Printf 
Prelude Text.Printf> printf "%.2f\n" (100 :: Float) 
100.00 
Prelude Text.Printf> printf "%.2f\n" $ fromIntegral 100/10.00 
10.00 

%f formatuje drugi argument w postaci liczby zmiennoprzecinkowej. %.2f wskazuje, że powinny zostać wydrukowane tylko dwie cyfry za kropką dziesiętną. \n reprezentuje znak nowej linii. Nie jest to konieczne dla tego przykładu.

Należy zauważyć, że ta funkcja zwraca wartość typu String lub IO a, w zależności od kontekstu. Demonstracja:

Prelude Text.Printf> printf "%.2f" (1337 :: Float) ++ " is a number" 
"1337.00 is a number" 

W tym przypadku printf zwraca łańcuch "1337.00", ponieważ wynik jest przekazywana jako argument do (++), która to funkcja, która spodziewa się lista argumentów (zauważ, że String jest taka sama jak [Char]). Jako taki, printf również zachowuje się jak sprintf w innych językach. Oczywiście sztuczka taka jak dodanie drugiego ciągu nie jest konieczna. Można po prostu jawnie określić typ:

Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: IO a 
1337.00 
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: String 
"1337.00\n" 
+2

Będę przeformułować pytanie :-) Chcę przywrócić reprezentację ciągów zmiennoprzecinkowych z dokładnie dwoma dziesiętnastymi - nie wypisz go na standardowe wyjście. Nie mogę znaleźć nic konkretnego na temat funkcji sprintf w Haskell, jak miałem nadzieję. Jakieś wskazówki? – Anders

+0

Dobra uwaga. Zaktualizowałem swoją odpowiedź. – Stephan202

+0

Spróbuj zaokrąglić, a następnie wydrukować zmiennoprzecinkowe? –