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
Ответ 2
Проверьте модуль Text.Printf
в базе:
https://hackage.haskell.org/package/base-4.9.0.0/docs/Text-Printf.html
Ответ 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 не рекомендуется, если не существует способа установить его.