Skip to content

Commit c21cf33

Browse files
authored
Merge pull request #50 from garyb/negative-sign-fix
Fix formatting of negative numbers with leading zeroes
2 parents 026b1bf + 44bec12 commit c21cf33

File tree

2 files changed

+21
-33
lines changed

2 files changed

+21
-33
lines changed

src/Data/Formatter/Number.purs

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,25 @@ module Data.Formatter.Number
1515

1616
import Prelude
1717

18-
import Data.Array as Arr
1918
import Data.Array (many, some)
20-
import Data.Maybe (Maybe(..), fromMaybe, isJust)
21-
import Data.Traversable (for)
19+
import Data.Array as Arr
2220
import Data.Either (Either, either)
21+
import Data.Formatter.Internal (foldDigits, repeat)
22+
import Data.Formatter.Parser.Number (parseDigit)
23+
import Data.Formatter.Parser.Utils (runP)
24+
import Data.Generic.Rep (class Generic)
25+
import Data.Generic.Rep.Show (genericShow)
2326
import Data.Int as Int
27+
import Data.Maybe (Maybe(..), fromMaybe, isJust)
28+
import Data.Newtype (class Newtype)
2429
import Data.String as Str
2530
import Data.String.CodeUnits as CU
26-
27-
import Data.Formatter.Parser.Utils (runP)
28-
import Data.Formatter.Internal (foldDigits, repeat)
29-
import Data.Formatter.Parser.Number (parseDigit)
30-
31+
import Data.Traversable (for)
3132
import Math as Math
32-
3333
import Text.Parsing.Parser as P
3434
import Text.Parsing.Parser.Combinators as PC
3535
import Text.Parsing.Parser.String as PS
3636

37-
import Data.Newtype (class Newtype)
38-
import Data.Generic.Rep (class Generic)
39-
import Data.Generic.Rep.Show (genericShow)
40-
4137

4238
newtype Formatter = Formatter
4339
{ comma Boolean
@@ -91,9 +87,10 @@ format ∷ Formatter → Number → String
9187
format (Formatter f) num =
9288
let
9389
absed = Math.abs num
94-
tens = if absed > 0.0
95-
then max (Int.floor $ Math.log absed / Math.ln10) 0
96-
else 0
90+
tens =
91+
if absed > 0.0
92+
then max (Int.floor $ Math.log absed / Math.ln10) 0
93+
else 0
9794
in if f.abbreviations
9895
then
9996
let
@@ -114,22 +111,17 @@ format (Formatter f) num =
114111
else
115112
let
116113
zeros = f.before - tens - one
117-
integer = Int.floor num
118-
leftover = num - Int.toNumber integer
119-
tehths = -1 * (Int.floor $ Math.log absed / Math.ln10)
120-
rounded =
121-
let
122-
multiplier = Math.pow 10.0 $ Int.toNumber f.after
123-
in Int.round $ leftover * multiplier
114+
integer = Int.floor absed
115+
leftover = absed - Int.toNumber integer
116+
rounded = Int.round $ leftover * (Math.pow 10.0 (Int.toNumber f.after))
124117
roundedWithZeros =
125118
let roundedString = show rounded
126119
roundedLength = Str.length roundedString
127120
zeros' = repeat "0" (f.after - roundedLength)
128121
in zeros' <> roundedString
129122
shownNumber =
130123
if f.comma
131-
then
132-
addCommas [] zero $ Arr.reverse $ CU.toCharArray (repeat "0" zeros <> show integer)
124+
then addCommas [] zero (Arr.reverse (CU.toCharArray (repeat "0" zeros <> show integer)))
133125
else repeat "0" zeros <> show integer
134126

135127
addCommas Array Char Int Array Char String
@@ -140,7 +132,7 @@ format (Formatter f) num =
140132
_ →
141133
addCommas (Arr.cons ',' acc) zero input
142134
in
143-
(if num > zero && f.sign then "+" else "")
135+
(if num < zero then "-" else if num > zero && f.sign then "+" else "")
144136
<> shownNumber
145137
<> (if f.after < 1
146138
then ""

test/src/Number.purs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,17 @@ numberTest = describe "Data.Formatter.Number" do
2323

2424
forAll show
2525
"unformat (format n) = n"
26-
[100.2, 100.1, 100.3, 10004000.0]
26+
[100.2, 100.1, 100.3, 10004000.0, -100.2, -100.1, -100.3, -10004000.0]
2727
(\n → unformat fmt1 (format fmt1 n) `shouldEqual` (Right n))
2828

2929
forAll show
3030
"format (unformat n) = n"
31-
[ "001.12", "001.02"
32-
]
31+
["001.12", "001.02", "-001.12", "-001.02"]
3332
(\n → (format fmt1 <$> (unformat fmt1 n)) `shouldEqual` (Right n))
3433

3534
forAll show
3635
"format (unformat n) = n"
37-
--TODO negative nubers fail https://github.com/slamdata/purescript-formatters/issues/16
38-
[-- "-02.12" -- (Right "0-3.88") ≠ (Right "-02.12")
39-
--, "-13.12" -- (Right "-14.88") ≠ (Right "-13.12")
40-
]
36+
["+02.12", "+13.12", "-02.12", "-13.12"]
4137
(\n → (format fmt3 <$> (unformat fmt3 n)) `shouldEqual` (Right n))
4238

4339
fmt1 Formatter

0 commit comments

Comments
 (0)