| | |
| | | 'use strict'; |
| | | var $ = require('../internals/export'); |
| | | var global = require('../internals/global'); |
| | | var uncurryThis = require('../internals/function-uncurry-this'); |
| | | var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); |
| | | var parseInt = require('../internals/number-parse-int'); |
| | | |
| | | var INVALID_NUMBER_REPRESENTATION = 'Invalid number representation'; |
| | | var INVALID_RADIX = 'Invalid radix'; |
| | | var RangeError = global.RangeError; |
| | | var SyntaxError = global.SyntaxError; |
| | | var TypeError = global.TypeError; |
| | | var valid = /^[\da-z]+$/; |
| | | var charAt = uncurryThis(''.charAt); |
| | | var exec = uncurryThis(valid.exec); |
| | | var numberToString = uncurryThis(1.0.toString); |
| | | var stringSlice = uncurryThis(''.slice); |
| | | |
| | | // `Number.fromString` method |
| | | // https://github.com/tc39/proposal-number-fromstring |
| | | $({ target: 'Number', stat: true }, { |
| | | $({ target: 'Number', stat: true, forced: true }, { |
| | | fromString: function fromString(string, radix) { |
| | | var sign = 1; |
| | | var R, mathNum; |
| | | if (typeof string != 'string') throw TypeError(INVALID_NUMBER_REPRESENTATION); |
| | | if (!string.length) throw SyntaxError(INVALID_NUMBER_REPRESENTATION); |
| | | if (string.charAt(0) == '-') { |
| | | if (charAt(string, 0) == '-') { |
| | | sign = -1; |
| | | string = string.slice(1); |
| | | string = stringSlice(string, 1); |
| | | if (!string.length) throw SyntaxError(INVALID_NUMBER_REPRESENTATION); |
| | | } |
| | | R = radix === undefined ? 10 : toIntegerOrInfinity(radix); |
| | | if (R < 2 || R > 36) throw RangeError(INVALID_RADIX); |
| | | if (!valid.test(string) || (mathNum = parseInt(string, R)).toString(R) !== string) { |
| | | if (!exec(valid, string) || numberToString(mathNum = parseInt(string, R), R) !== string) { |
| | | throw SyntaxError(INVALID_NUMBER_REPRESENTATION); |
| | | } |
| | | return sign * mathNum; |