2010-09-20 3 views
10

Czy istnieje funkcja biblioteczna do wstawiania przecinków do liczb za pomocą Haskella?Haskell: Formatuj numer z przecinkami

chcę funkcję, która będzie działać tak:

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

ale nie wydaje się znaleźć dowolną liczbę funkcji tego typu w Haskell formatowania. Gdzie są funkcje formatowania liczb?

+4

++ Pytam o bibliotekę, a nie funkcję. –

+0

Jest to prawdopodobnie powiązane: http: // stackoverflow.com/questions/1388209/how-to-format-numbers-according-to-locale-in-haskell (jak formatować liczby zgodnie z ustawieniami narodowymi) – sastanin

+2

Jeśli biblioteka nie istnieje, powinieneś użyć tego jako świetnego pretekstu do napisania pierwszy pakiet Haskell Cabal. –

Odpowiedz

1
+3

Nie jestem pewien, czy działa to, co jest wymagane. To po prostu dostarcza 'printf', ale jaka implementacja' printf' obsługuje regionalny wyświetlacz numeryczny z przecinkami? To, czego chce, to coś w rodzaju [Numer :: Format] (http://search.cpan.org/dist/Number-Format/Format.pm) dla Perla. –

8

Być może korzystać z niektórych funkcji z Data.Split:

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

Znam tego ISN” t czego chcesz, ale możesz użyć Data.List.intersperse

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

EDIT: To nie to, co chcesz, choć wiem, że chcesz to funkcja biblioteki, może to być tak blisko, jak można dostać (proszę wybaczyć moją biedną styl kodowania):

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

To było również moje myślenie. –

+0

Dla Floats, 'show x' powinno zostać zamienione na' showFFloat Nothing x "" 'from' Numeric' package. Ponadto 'splitEvery' jest teraz' chunksOf'. – VlatkoB

0

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

formatowania dziesiętnych Haskell

formatt funkcja z numerów takich jak 333999333.33 do "333,999,999.33" w Haskell. Radzi sobie z liczbami ujemnymi i rundami do 2 dp (łatwo można dodać do tego paramater).

Przykłady:

* Główna> formatDecimal 44

"44.00"

* Główna> formatDecimal 94.280.943,4324

"94,280,943.43"

* Główna> 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

Sam miałem ten problem. Moje bardzo pragmatyczne rozwiązanie (użycie tekstu jako T) jest następujące:

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

Nie działa jednak w przypadku separatorów. To było w porządku ze mną.

Dla mnie ustawienie regionalne nie jest pomocne, chyba że istnieje sposób na jego ustawienie.