是否有库函数将逗号放入Haskell的数字中?
我想要一个可以这样工作的函数:
format 1000000 = "1,000,000"
format 1045.31 = "1,045.31"
但我似乎无法在Haskell中找到此类型的任何数字格式化函数。数字格式化功能在哪里?
答案 0 :(得分:9)
也许您可以使用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
编辑:这样做你想要的,虽然我知道你想要一个库函数,但这可能就像你得到的那样接近(请原谅我糟糕的编码风格):
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
答案 1 :(得分:1)
使用格式数字库
Prelude> import Data.Text.Format.Numbers
Prelude Data.Text.Format.Numbers> prettyF (PrettyCfg 2 (Just ',') '.') 2132871293.3412
"2,132,871,293.34"
答案 2 :(得分:0)
(来自hier:http://bluebones.net/2007/02/formatting-decimals-in-haskell/)
格式化Haskell中的小数
格式化函数,在Haskell中从333999333.33到“333,999,999.33”等数字。应对负数和舍入到2 dp(如果你愿意,很容易添加一个参数)。
示例:
*主> formatDecimal 44
“44.00”
*主> formatDecimal 94280943.4324
“94,280,943.43”
*主> 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
答案 3 :(得分:0)
我自己也遇到过这个问题。我非常务实的解决方案(使用Text as T)是这样的:
T.replace (T.singleton '.') (T.singleton ',') $
T.pack $
showFixed False 42.0
但是,对分隔符不起作用。那对我很好。
对我来说,除非有办法设置,否则Locale没有帮助。
答案 4 :(得分:0)
我正在使用的另一种解决方案:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at estaticos.Criptografador.descompilarMapaData(Criptografador.java:152)
at variables.Mapa.<init>(Mapa.java:1306)
at estaticos.GestorSQL.CARREGAR_MAPAS(GestorSQL.java:696)
at estaticos.MundoDofus.criarServer(MundoDofus.java:1398)
at estaticos.VrauEMU.main(VrauEMU.java:130)
答案 5 :(得分:-1)
查看 base 中的Text.Printf
模块:
https://hackage.haskell.org/package/base-4.9.0.0/docs/Text-Printf.html