Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
65 lines (57 sloc)
1.53 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |