2010-09-20 76 views
10

Có chức năng thư viện nào để đặt dấu phẩy vào số bằng Haskell không?Haskell: Định dạng số có dấu phẩy

Tôi muốn có một chức năng mà sẽ làm việc một cái gì đó như thế này:

format 1000000 = "1,000,000" 
format 1045.31 = "1,045.31" 

nhưng tôi dường như không thể tìm thấy bất kỳ định dạng số chức năng thuộc loại này trong Haskell. Các hàm định dạng số ở đâu?

+4

++ Để yêu cầu thư viện chứ không phải chức năng. –

+0

Điều này có thể liên quan: http: // stackoverflow.com/questions/1388209/how-to-format-number-theo-to-locale-in-haskell (cách định dạng các số theo ngôn ngữ) – sastanin

+2

Nếu thư viện không tồn tại thì bạn nên sử dụng nó như một lý do tuyệt vời để viết Gói Haskell Cabal đầu tiên của bạn. –

Trả lời

1

Kiểm tra các Text.Printf mô-đun trong cơ sở:

https://hackage.haskell.org/package/base-4.9.0.0/docs/Text-Printf.html

+3

Tôi không chắc chắn điều này phù hợp với những gì được yêu cầu. Điều này chỉ đơn giản là cung cấp 'printf', nhưng những gì thực hiện' printf' hỗ trợ hiển thị số khu vực bằng dấu phẩy? Những gì anh ta muốn là một cái gì đó như [Số :: Định dạng] (http://search.cpan.org/dist/Number-Format/Format.pm) cho perl. –

8

lẽ bạn có thể sử dụng một số chức năng từ Data.Split:

http://hackage.haskell.org/cgi-bin/hackage-scripts/package/split

Tôi biết isn này' nhưng bạn có thể sử dụng Data.List.intersperse

http://haskell.org/ghc/docs/6.12.1/html/libraries/base-4.2.0.0/Data-List.html#v:intersperse

EDIT: Đây có phải những gì bạn muốn, mặc dù tôi biết bạn muốn có một chức năng thư viện, điều này có thể gần như là bạn có được (xin tha phong cách mã hóa nghèo của tôi):

import Data.List.Split 
import Data.List 

format x = h++t 
    where 
     sp = break (== '.') $ show x 
     h = reverse (intercalate "," $ splitEvery 3 $ reverse $ fst sp) 
     t = snd sp 
+0

Đây thực sự là suy nghĩ của tôi. –

+0

Đối với Floats, 'show x' sẽ được thay thế bằng' showFFloat Nothing x "" 'từ' Numeric' package. Ngoài ra, 'splitEvery' là' chunksOf' bây giờ. – VlatkoB

0

(từ hier: http://bluebones.net/2007/02/formatting-decimals-in-haskell/)

Formatting thập phân trong Haskell

Một formatt Hàm ing để chuyển từ các số như 333999333.33 sang “333.999.999.33 ″ trong Haskell. Copes với số âm và vòng đến 2 dp (dễ dàng để thêm một paramater cho rằng bạn nên muốn).

Ví dụ:

* Main> formatDecimal 44

"44.00"

* Main> formatDecimal 94280943,4324

"94,280,943.43"

* Main> formatDecimal (-89.438,329)

"-89,438.33"

import Data.Graph.Inductive.Query.Monad (mapFst) 
import List 
import Text.Printf 

formatDecimal d 
    | d < 0.0 = "-" ++ (formatPositiveDecimal (-d)) 
    | otherwise = formatPositiveDecimal d 
    where formatPositiveDecimal = uncurry (++) . mapFst addCommas . span (/= '.') . printf "%0.2f" 
      addCommas = reverse . concat . intersperse "," . unfoldr splitIntoBlocksOfThree . reverse 
      splitIntoBlocksOfThree l = case splitAt 3 l of ([], _) -> Nothing; p-> Just p 
0

Tôi đã gặp sự cố này. Giải pháp thực dụng của tôi (sử dụng Văn bản dưới dạng T) là:

T.replace (T.singleton '.') (T.singleton ',') $ 
T.pack $ 
showFixed False 42.0 

Không hoạt động cho máy phân tách. Điều đó tốt với tôi.

Đối với tôi, Locale không hữu ích trừ khi có cách thiết lập.

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