2010-09-20 26 views
10

¿Existe una función de biblioteca para poner comas en números con Haskell?Haskell: Número de formato con comas

Quiero una función que funcionaría así:

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

pero me parece que no puede encontrar cualquier número de funciones de formato de este tipo en Haskell. ¿Dónde están las funciones de formateo de números?

+4

++ Para pedir una biblioteca y no una función. –

+0

Esto probablemente esté relacionado: http: // stackoverflow.com/questions/1388209/how-to-format-numbers-according-to-locale-in-haskell (cómo formatear los números según la configuración regional) – sastanin

+2

Si la biblioteca no existe, entonces debe usar esto como una gran excusa para escribir su primer paquete Haskell Cabal. –

Respuesta

1
+3

No estoy seguro de que esto funcione para lo que se solicita. Esto simplemente proporciona 'printf', pero ¿qué implementación de' printf' admite la visualización numérica regional con comas? Lo que él quiere es algo como [Number :: Format] (http://search.cpan.org/dist/Number-Format/Format.pm) para Perl. –

8

Tal vez usted podría utilizar algunas de las funciones de Data.Split:

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

Sé que esto no es' Es todo lo que quiere, pero podría usar Data.List.intersperse

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

EDITAR: Esto hace lo que quiere, aunque sé que desea una función de biblioteca, esto puede ser tan cerca como llegar (disculpen mi estilo de codificación poco):

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

Esto fue realmente mi pensamiento también. –

+0

Para Flotantes, 'show x' debe reemplazarse con' showFFloat Nothing x "" 'del paquete' Numeric'. Además, 'splitEvery' es' chunksOf' ahora. – VlatkoB

0

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

Formateo decimales en Haskell

a formatt La función ing le permite ir desde números como 333999333.33 hasta "333,999,999.33" en Haskell. Se adapta a números negativos y rondas a 2 dp (es fácil agregar un parámetro para eso si lo desea).

Ejemplos:

* Inicio> formatDecimal 44

"44.00"

* Inicio> formatDecimal 94,280,943.4324

"94,280,943.43"

* Inicio> 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

He tenido este problema yo mismo. Mi solución muy pragmática (usando Text as T) es la siguiente:

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

No funciona para los separadores, sin embargo. Eso estuvo bien conmigo.

Para mí, la configuración regional no es útil a menos que haya una forma de configurarla.