| var isObject = require('./isObject'), |
| isSymbol = require('./isSymbol'); |
| |
| /** Used as references for various `Number` constants. */ |
| var NAN = 0 / 0; |
| |
| /** Used to match leading and trailing whitespace. */ |
| var reTrim = /^\s+|\s+$/g; |
| |
| /** Used to detect bad signed hexadecimal string values. */ |
| var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; |
| |
| /** Used to detect binary string values. */ |
| var reIsBinary = /^0b[01]+$/i; |
| |
| /** Used to detect octal string values. */ |
| var reIsOctal = /^0o[0-7]+$/i; |
| |
| /** Built-in method references without a dependency on `root`. */ |
| var freeParseInt = parseInt; |
| |
| /** |
| * Converts `value` to a number. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to process. |
| * @returns {number} Returns the number. |
| * @example |
| * |
| * _.toNumber(3.2); |
| * // => 3.2 |
| * |
| * _.toNumber(Number.MIN_VALUE); |
| * // => 5e-324 |
| * |
| * _.toNumber(Infinity); |
| * // => Infinity |
| * |
| * _.toNumber('3.2'); |
| * // => 3.2 |
| */ |
| function toNumber(value) { |
| if (typeof value == 'number') { |
| return value; |
| } |
| if (isSymbol(value)) { |
| return NAN; |
| } |
| if (isObject(value)) { |
| var other = typeof value.valueOf == 'function' ? value.valueOf() : value; |
| value = isObject(other) ? (other + '') : other; |
| } |
| if (typeof value != 'string') { |
| return value === 0 ? value : +value; |
| } |
| value = value.replace(reTrim, ''); |
| var isBinary = reIsBinary.test(value); |
| return (isBinary || reIsOctal.test(value)) |
| ? freeParseInt(value.slice(2), isBinary ? 2 : 8) |
| : (reIsBadHex.test(value) ? NAN : +value); |
| } |
| |
| module.exports = toNumber; |