Skip to content

Commit b879e9e

Browse files
authored
Merge pull request #4 from i-am-tom/master
Add `fromString` method
2 parents c1aba38 + 6fc3b40 commit b879e9e

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

src/Data/Number.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
exports.fromStringImpl = function (just) {
2+
return function (nothing) {
3+
return function (string) {
4+
var result = parseFloat(string);
5+
6+
return isNaN(result) ? nothing
7+
: just(result);
8+
};
9+
};
10+
};

src/Data/Number.purs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Data.Number
55
, eqApproximate
66
, (~=)
77
, (≅)
8+
, fromString
89
, neqApproximate
910
, (≇)
1011
, Precision
@@ -13,8 +14,37 @@ module Data.Number
1314

1415
import Prelude
1516

17+
import Data.Maybe (Maybe(..))
1618
import Math (abs)
1719

20+
21+
foreign import fromStringImpl
22+
:: (forall a. a -> Maybe a)
23+
-> (forall a. Maybe a)
24+
-> String
25+
-> Maybe Number
26+
27+
28+
-- | Attempt to parse a Number from a String using JavaScript's parseFloat.
29+
-- |
30+
-- | Example:
31+
-- | ```purs
32+
-- | > fromString "123"
33+
-- | (Just 123.0)
34+
-- |
35+
-- | > fromString "12.34"
36+
-- | (Just 12.34)
37+
-- |
38+
-- | > fromString "1e4"
39+
-- | (Just 10000.0)
40+
-- |
41+
-- | > fromString "1.2e4"
42+
-- | (Just 12000.0)
43+
-- | ```
44+
fromString :: String -> Maybe Number
45+
fromString = fromStringImpl Just Nothing
46+
47+
1848
-- | A type alias for (small) numbers, typically in the range *[0:1]*.
1949
type Fraction = Number
2050

test/Main.purs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ module Test.Main where
22

33
import Prelude
44

5-
import Data.Number (eqRelative, eqAbsolute, (≅), (≇))
5+
import Data.Maybe (fromMaybe)
6+
import Data.Number (eqRelative, eqAbsolute, fromString, (≅), (≇))
67

78
import Control.Monad.Aff.AVar (AVAR)
89
import Control.Monad.Eff (Eff)
@@ -119,6 +120,25 @@ main = runTest do
119120
0.1 + 0.2000010.3
120121

121122

123+
suite "fromString" do
124+
test "valid number string" do
125+
assert "integer strings are coerced" $
126+
fromMaybe false $ map (_ == 123.0) $ fromString "123"
127+
128+
assert "decimals are coerced" $
129+
fromMaybe false $ map (_ == 12.34) $ fromString "12.34"
130+
131+
assert "exponents are coerced" $
132+
fromMaybe false $ map (_ == 1e4) $ fromString "1e4"
133+
134+
assert "decimals exponents are coerced" $
135+
fromMaybe false $ map (_ == 1.2e4) $ fromString "1.2e4"
136+
137+
test "invalid number string" do
138+
assert "invalid strings are not coerced" $
139+
fromMaybe true $ false <$ fromString "bad string"
140+
141+
122142
suite "eqAbsolute" do
123143
test "eqAbsolute" do
124144
assert "should succeed for differences smaller than the precision" $

0 commit comments

Comments
 (0)