Skip to content

Commit

Permalink
feat: number/coerce
Browse files Browse the repository at this point in the history
  • Loading branch information
medikoo committed Apr 3, 2019
1 parent b6700ed commit 86ccf08
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 1 deletion.
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,28 @@ ensureString(12); // "12"
ensureString(null); // Thrown TypeError: null is not a string
```

#### Number

_number_ primitives

##### `number/coerce`

Restricted number coercion. Returns number presentation for every value that follows below constraints

- is implicitly coercible to number
- is neither `null` nor `undefined`
- is not and doesn't coerce to `NaN`

For all other values `null` is returned

```javascript
const numberCoerce = require("type/number/coerce");

numberCoerce("12"); // 12
numberCoerce({}); // null
numberCoerce(null); // null
```

#### Object

_Object_ is assumed to be any non-primitive JavaScript value
Expand Down
14 changes: 14 additions & 0 deletions number/coerce.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"use strict";

var isValue = require("../value/is");

module.exports = function (value) {
if (!isValue(value)) return null;
try {
value = +value; // Ensure implicit coercion
} catch (error) {
return null;
}
if (isNaN(value)) return null;
return value;
};
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@
}
},
{
"files": "string/coerce.js",
"files": [
"string/coerce.js",
"number/coerce.js"
],
"rules": {
"no-implicit-coercion": "off"
}
Expand Down
33 changes: 33 additions & 0 deletions test/number/coerce.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"use strict";

var assert = require("chai").assert
, numberCoerce = require("../../number/coerce");

describe("number/coerce", function () {
it("Should return input number", function () { assert.equal(numberCoerce(123.123), 123.123); });
it("Should coerce string", function () { assert.equal(numberCoerce("12"), 12); });
it("Should coerce booleans", function () { assert.equal(numberCoerce(true), 1); });
it("Should coerce number objects", function () {
assert.equal(numberCoerce(new Number(343)), 343);
});
it("Should coerce objects", function () {
assert.equal(numberCoerce({ valueOf: function () { return 23; } }), 23);
});

it("Should reject NaN", function () { assert.equal(numberCoerce(NaN), null); });

if (typeof Object.create === "function") {
it("Should not coerce objects with no number representation", function () {
assert.equal(numberCoerce(Object.create(null)), null);
});
}

it("Should not coerce null", function () { assert.equal(numberCoerce(null), null); });
it("Should not coerce undefined", function () { assert.equal(numberCoerce(undefined), null); });

if (typeof Symbol === "function") {
it("Should not coerce symbols", function () {
assert.equal(numberCoerce(Symbol("foo")), null);
});
}
});

0 comments on commit 86ccf08

Please sign in to comment.