UNPKG

1.74 kBJavaScriptView Raw
1'use strict';
2var $ = require('../internals/export');
3var uncurryThis = require('../internals/function-uncurry-this');
4var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
5
6var INVALID_NUMBER_REPRESENTATION = 'Invalid number representation';
7var INVALID_RADIX = 'Invalid radix';
8var $RangeError = RangeError;
9var $SyntaxError = SyntaxError;
10var $TypeError = TypeError;
11var $parseInt = parseInt;
12var pow = Math.pow;
13var valid = /^[\d.a-z]+$/;
14var charAt = uncurryThis(''.charAt);
15var exec = uncurryThis(valid.exec);
16var numberToString = uncurryThis(1.0.toString);
17var stringSlice = uncurryThis(''.slice);
18var split = uncurryThis(''.split);
19
20// `Number.fromString` method
21// https://github.com/tc39/proposal-number-fromstring
22$({ target: 'Number', stat: true, forced: true }, {
23 fromString: function fromString(string, radix) {
24 var sign = 1;
25 if (typeof string != 'string') throw new $TypeError(INVALID_NUMBER_REPRESENTATION);
26 if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);
27 if (charAt(string, 0) === '-') {
28 sign = -1;
29 string = stringSlice(string, 1);
30 if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);
31 }
32 var R = radix === undefined ? 10 : toIntegerOrInfinity(radix);
33 if (R < 2 || R > 36) throw new $RangeError(INVALID_RADIX);
34 if (!exec(valid, string)) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);
35 var parts = split(string, '.');
36 var mathNum = $parseInt(parts[0], R);
37 if (parts.length > 1) mathNum += $parseInt(parts[1], R) / pow(R, parts[1].length);
38 if (R === 10 && numberToString(mathNum, R) !== string) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);
39 return sign * mathNum;
40 }
41});