[d565449] | 1 | import baseTrim from './_baseTrim.js';
|
---|
| 2 | import isObject from './isObject.js';
|
---|
| 3 | import isSymbol from './isSymbol.js';
|
---|
| 4 |
|
---|
| 5 | /** Used as references for various `Number` constants. */
|
---|
| 6 | var NAN = 0 / 0;
|
---|
| 7 |
|
---|
| 8 | /** Used to detect bad signed hexadecimal string values. */
|
---|
| 9 | var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
---|
| 10 |
|
---|
| 11 | /** Used to detect binary string values. */
|
---|
| 12 | var reIsBinary = /^0b[01]+$/i;
|
---|
| 13 |
|
---|
| 14 | /** Used to detect octal string values. */
|
---|
| 15 | var reIsOctal = /^0o[0-7]+$/i;
|
---|
| 16 |
|
---|
| 17 | /** Built-in method references without a dependency on `root`. */
|
---|
| 18 | var freeParseInt = parseInt;
|
---|
| 19 |
|
---|
| 20 | /**
|
---|
| 21 | * Converts `value` to a number.
|
---|
| 22 | *
|
---|
| 23 | * @static
|
---|
| 24 | * @memberOf _
|
---|
| 25 | * @since 4.0.0
|
---|
| 26 | * @category Lang
|
---|
| 27 | * @param {*} value The value to process.
|
---|
| 28 | * @returns {number} Returns the number.
|
---|
| 29 | * @example
|
---|
| 30 | *
|
---|
| 31 | * _.toNumber(3.2);
|
---|
| 32 | * // => 3.2
|
---|
| 33 | *
|
---|
| 34 | * _.toNumber(Number.MIN_VALUE);
|
---|
| 35 | * // => 5e-324
|
---|
| 36 | *
|
---|
| 37 | * _.toNumber(Infinity);
|
---|
| 38 | * // => Infinity
|
---|
| 39 | *
|
---|
| 40 | * _.toNumber('3.2');
|
---|
| 41 | * // => 3.2
|
---|
| 42 | */
|
---|
| 43 | function toNumber(value) {
|
---|
| 44 | if (typeof value == 'number') {
|
---|
| 45 | return value;
|
---|
| 46 | }
|
---|
| 47 | if (isSymbol(value)) {
|
---|
| 48 | return NAN;
|
---|
| 49 | }
|
---|
| 50 | if (isObject(value)) {
|
---|
| 51 | var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
|
---|
| 52 | value = isObject(other) ? (other + '') : other;
|
---|
| 53 | }
|
---|
| 54 | if (typeof value != 'string') {
|
---|
| 55 | return value === 0 ? value : +value;
|
---|
| 56 | }
|
---|
| 57 | value = baseTrim(value);
|
---|
| 58 | var isBinary = reIsBinary.test(value);
|
---|
| 59 | return (isBinary || reIsOctal.test(value))
|
---|
| 60 | ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
|
---|
| 61 | : (reIsBadHex.test(value) ? NAN : +value);
|
---|
| 62 | }
|
---|
| 63 |
|
---|
| 64 | export default toNumber;
|
---|