Haskell: номер формата с запятыми

Есть ли библиотечная функция для помещения запятых в числа с помощью Haskell?

Мне нужна функция, которая будет работать примерно так:

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

но я не могу найти никаких функций форматирования номера этого типа в Haskell. Где функции форматирования чисел?

Ответ 1

Возможно, вы могли бы использовать некоторые функции из Data.Split:

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

Я знаю, что это не совсем то, что вы хотите, но вы можете использовать Data.List.intersperse

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

EDIT. Это делает то, что вы хотите, хотя я знаю, что вы хотите библиотечную функцию, это может быть как можно ближе (пожалуйста, извините мой плохой стиль кодирования):

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

Ответ 3

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

Форматирование децимал в Haskell

Функция форматирования переходила от чисел, таких как 333999333.33, к "333,999,999.33" в Haskell. Копирует с отрицательными числами и раундами до 2 дп (легко добавить параметр, если вы пожелаете).

Примеры:

* Main > formatDecimal 44

"44,00"

* Main > formatDecimal 94280943.4324

"94,280,943.43"

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

Ответ 4

У меня была эта проблема. Мое очень прагматическое решение (с использованием Text as T) заключается в следующем:

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

Не работает для разделителей. Это было хорошо со мной.

Для меня Locale не рекомендуется, если не существует способа установить его.