2009-10-13 36 views

Trả lời

51

Chỉ cần cho các hồ sơ:

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

IMO câu trả lời này phải là câu trả lời được chấp nhận. –

+0

@NikitaVolkov Xong. Muộn còn hơn không ;-) – Anders

22

Bạn có thể sử dụng printf :: PrintfType r => String -> r từ 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 định dạng đối số thứ hai là một số dấu chấm động. %.2f cho biết chỉ nên in hai chữ số sau dấu thập phân. \n đại diện cho một dòng mới. Nó không hoàn toàn cần thiết cho ví dụ này.

Lưu ý rằng hàm này trả về một giá trị loại String hoặc IO a, tùy thuộc vào ngữ cảnh. Minh họa:

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

Trong trường hợp này printf trả về chuỗi "1337.00", bởi vì kết quả được thông qua như là một cuộc tranh cãi để (++), mà là một chức năng mà hy vọng đối số danh sách (lưu ý rằng String cũng giống như [Char]). Như vậy, printf cũng hoạt động như sprintf sẽ bằng các ngôn ngữ khác. Tất nhiên một thủ thuật như phụ thêm một chuỗi thứ hai là không cần thiết. Bạn chỉ có thể chỉ định rõ kiểu dữ liệu:

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

Tôi sẽ thuật lại câu hỏi :-) Tôi muốn trả về một biểu diễn chuỗi của một phao với chính xác hai số thập phân - không in nó thành stdout. Tôi không thể tìm thấy bất cứ điều gì cụ thể về chức năng 'chạy nước rút' trong Haskell như tôi đã hy vọng. Bất kỳ gợi ý nào? – Anders

+0

Điểm tốt. Tôi đã cập nhật câu trả lời của mình. – Stephan202

+0

Thử làm tròn sau đó in nổi? –

Các vấn đề liên quan