2010-09-20 5 views
10

Y at-il une fonction de bibliothèque pour mettre des virgules dans les nombres avec Haskell?Haskell: Numéro de format avec des virgules

Je veux une fonction qui fonctionnerait quelque chose comme ceci:

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

, mais je ne peux pas sembler trouver un certain nombre de fonctions de formatage ce type dans Haskell. Où sont les fonctions de formatage des nombres?

+4

++ Pour demander une bibliothèque et non une fonction. –

+0

Ceci est probablement lié: http: // stackoverflow.com/questions/1388209/comment-formater-nombres-selon-locale-dans-haskell (comment formater les nombres selon les paramètres régionaux) – sastanin

+2

Si la bibliothèque n'existe pas alors vous devriez l'utiliser comme une bonne excuse pour écrire votre premier paquet Haskell Cabal. –

Répondre

1

Vérifiez le module Text.Printf dans la base :

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

+3

Je ne suis pas sûr que cela fonctionne pour ce qui est demandé. Cela fournit simplement 'printf', mais quelle implémentation de' printf' supporte l'affichage numérique régional avec des virgules? Ce qu'il veut, c'est quelque chose comme [Number :: Format] (http://search.cpan.org/dist/Number-Format/Format.pm) pour perl. –

8

Peut-être que vous pourriez utiliser certaines des fonctions de Data.Split:

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

Je sais que ce n » t tout à fait ce que vous voulez, mais vous pouvez utiliser Data.List.intersperse

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

EDIT: Ce fait ce que vous voulez, même si je sais que vous voulez une fonction de bibliothèque, cela peut être aussi proche que vous (s'il vous plaît excuser mon pauvre style de codage):

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

C'était en fait ma pensée aussi bien. –

+0

Pour Floats, 'show x' doit être remplacé par' showFFloat Nothing x "" 'dans le paquetage' Numeric'. De plus, 'splitEvery' est' chunksOf' maintenant. – VlatkoB

0

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

Mise en forme des nombres décimaux en Haskell

A formatt Pour passer de numéros comme 333999333.33 à "333,999,999.33" dans Haskell. Copes avec des nombres négatifs et des tours à 2 dp (facile d'ajouter un paramètre pour cela si vous le souhaitez).

Exemples:

* principal> formatDecimal 44

"44,00"

* Menu principal> formatDecimal 94.280.943,4324

"94,280,943.43"

* principal> formatDecimal (-89438,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

J'ai moi-même eu ce problème. Ma solution très pragmatique (en utilisant Texte comme T) est la suivante:

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

Ne fonctionne pas pour les séparateurs, cependant. C'était bien avec moi.

Pour moi Les paramètres régionaux ne sont pas utiles sauf s'il existe un moyen de le définir.

Questions connexes