| import isObject from './isObject.js' | |
| import isSymbol from './isSymbol.js' | |
| /** Used as references for various `Number` constants. */ | |
| const NAN = 0 / 0 | |
| /** Used to match leading and trailing whitespace. */ | |
| const reTrim = /^\s+|\s+$/g | |
| /** Used to detect bad signed hexadecimal string values. */ | |
| const reIsBadHex = /^[-+]0x[0-9a-f]+$/i | |
| /** Used to detect binary string values. */ | |
| const reIsBinary = /^0b[01]+$/i | |
| /** Used to detect octal string values. */ | |
| const reIsOctal = /^0o[0-7]+$/i | |
| /** Built-in method references without a dependency on `root`. */ | |
| const freeParseInt = parseInt | |
| /** | |
| * Converts `value` to a number. | |
| * | |
| * @since 4.0.0 | |
| * @category Lang | |
| * @param {*} value The value to process. | |
| * @returns {number} Returns the number. | |
| * @see isInteger, toInteger, isNumber | |
| * @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)) { | |
| const 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, '') | |
| const isBinary = reIsBinary.test(value) | |
| return (isBinary || reIsOctal.test(value)) | |
| ? freeParseInt(value.slice(2), isBinary ? 2 : 8) | |
| : (reIsBadHex.test(value) ? NAN : +value) | |
| } | |
| export default toNumber |