Commatizing numbers: Difference between revisions
Content added Content deleted
(Added Wren) |
(→{{header|Go}}: Added Haskell) |
||
Line 450: | Line 450: | ||
$-140,000±100 millions. |
$-140,000±100 millions. |
||
6/9/1946 was a good year for some. |
6/9/1946 was a good year for some. |
||
</pre> |
|||
=={{header|Haskell}}== |
|||
{{Works with|GHC|7.8.3}} |
|||
<lang haskell>#!/usr/bin/env runhaskell |
|||
import Control.Monad |
|||
import Data.Char |
|||
import Data.List |
|||
import Data.Maybe |
|||
{- |
|||
I use the suffix "2" in identifiers in place of the more conventional |
|||
prime (single quote character), because Rosetta Code's syntax highlighter |
|||
still doesn't handle primes in identifiers correctly. |
|||
-} |
|||
isDigitOrPeriod :: Char -> Bool |
|||
isDigitOrPeriod '.' = True |
|||
isDigitOrPeriod c = isDigit c |
|||
chopUp :: Int -> String -> [String] |
|||
chopUp _ [] = [] |
|||
chopUp by str |
|||
| by < 1 = [str] -- invalid argument, leave string unchanged |
|||
| otherwise = let (pfx, sfx) = splitAt by str |
|||
in pfx : chopUp by sfx |
|||
addSeps :: String -> Char -> Int -> (String -> String) -> String |
|||
addSeps str sep by rev = |
|||
let (leading, number) = span (== '0') str |
|||
number2 = rev $ intercalate [sep] $ chopUp by $ rev number |
|||
in leading ++ number2 |
|||
processNumber :: String -> Char -> Int -> String |
|||
processNumber str sep by = |
|||
let (beforeDecimal, rest) = span isDigit str |
|||
(decimal, afterDecimal) = splitAt 1 rest |
|||
beforeDecimal2 = addSeps beforeDecimal sep by reverse |
|||
afterDecimal2 = addSeps afterDecimal sep by id |
|||
in beforeDecimal2 ++ decimal ++ afterDecimal2 |
|||
commatize2 :: String -> Char -> Int -> String |
|||
commatize2 [] _ _ = [] |
|||
commatize2 str sep by = |
|||
let (pfx, sfx) = span (not . isDigitOrPeriod) str |
|||
(number, sfx2) = span isDigitOrPeriod sfx |
|||
in pfx ++ processNumber number sep by ++ sfx2 |
|||
commatize :: String -> Maybe Char -> Maybe Int -> String |
|||
commatize str sep by = commatize2 str (fromMaybe ',' sep) (fromMaybe 3 by) |
|||
input :: [(String, Maybe Char, Maybe Int)] |
|||
input = |
|||
[ ("pi=3.14159265358979323846264338327950288419716939937510582097494459231", Just ' ', Just 5) |
|||
, ("The author has two Z$100000000000000 Zimbabwe notes (100 trillion).", Just '.', Nothing) |
|||
, ("\"-in Aus$+1411.8millions\"", Nothing, Nothing) |
|||
, ("===US$0017440 millions=== (in 2000 dollars)", Nothing, Nothing) |
|||
, ("123.e8000 is pretty big.", Nothing, Nothing) |
|||
, ("The land area of the earth is 57268900(29% of the surface) square miles.", Nothing, Nothing) |
|||
, ("Ain't no numbers in this here words, nohow, no way, Jose.", Nothing, Nothing) |
|||
, ("James was never known as 0000000007", Nothing, Nothing) |
|||
, ("Arthur Eddington wrote: I believe there are 15747724136275002577605653961181555468044717914527116709366231425076185631031296 protons in the universe.", Nothing, Nothing) |
|||
, (" $-140000±100 millions.", Nothing, Nothing) |
|||
, ("6/9/1946 was a good year for some.", Nothing, Nothing) |
|||
] |
|||
main = do |
|||
forM_ input $ \(str, by, sep) -> do |
|||
putStrLn str |
|||
putStrLn $ commatize str by sep |
|||
putStrLn "" |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
pi=3.14159265358979323846264338327950288419716939937510582097494459231 |
|||
pi=3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59231 |
|||
The author has two Z$100000000000000 Zimbabwe notes (100 trillion). |
|||
The author has two Z$100.000.000.000.000 Zimbabwe notes (100 trillion). |
|||
"-in Aus$+1411.8millions" |
|||
"-in Aus$+1,411.8millions" |
|||
===US$0017440 millions=== (in 2000 dollars) |
|||
===US$0017,440 millions=== (in 2000 dollars) |
|||
123.e8000 is pretty big. |
|||
123.e8000 is pretty big. |
|||
The land area of the earth is 57268900(29% of the surface) square miles. |
|||
The land area of the earth is 57,268,900(29% of the surface) square miles. |
|||
Ain't no numbers in this here words, nohow, no way, Jose. |
|||
Ain't no numbers in this here words, nohow, no way, Jose. |
|||
James was never known as 0000000007 |
|||
James was never known as 0000000007 |
|||
Arthur Eddington wrote: I believe there are 15747724136275002577605653961181555468044717914527116709366231425076185631031296 protons in the universe. |
|||
Arthur Eddington wrote: I believe there are 15,747,724,136,275,002,577,605,653,961,181,555,468,044,717,914,527,116,709,366,231,425,076,185,631,031,296 protons in the universe. |
|||
$-140000±100 millions. |
|||
$-140,000±100 millions. |
|||
6/9/1946 was a good year for some. |
|||
6/9/1946 was a good year for some. |
|||
</pre> |
</pre> |
||