You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.2 KiB
54 lines
1.2 KiB
'use strict' |
|
var isNumber = require('lodash.isfinite') |
|
|
|
/** |
|
* @id isNumberLike |
|
* @function isNumberLike |
|
* Checks whether provided parameter looks like a number |
|
* @param {any} val - the value to check |
|
* @returns {boolean} looksLikeNumber - `true` if `val` looks like a number, `false` otherwise |
|
*/ |
|
module.exports = function isNumberLike (val) { |
|
// fail |
|
if (val === null || val === void 0 || val === false) { |
|
return false |
|
} |
|
if (typeof val === 'function' || val instanceof Array) { |
|
return false |
|
} |
|
var length = val.length |
|
if (!length) { |
|
return isNumber(val) |
|
} |
|
var i = 0 |
|
// charAt is faster in v8 |
|
if (val.charAt(0) === '-') { |
|
if (length === 1) { |
|
// fail do it |
|
return false |
|
} |
|
i = 1 |
|
} |
|
var foundE = false |
|
var foundPeriod = false |
|
for (; i < length; i++) { |
|
var c = val.charAt(i) |
|
// bit range is outside number range |
|
if ((c <= '/' || c >= ':')) { |
|
if (c === 'e') { |
|
if (foundE) { |
|
return false |
|
} |
|
foundE = true |
|
} else if (c === '.') { |
|
if (foundPeriod) { |
|
return false |
|
} |
|
foundPeriod = true |
|
} else { |
|
return false |
|
} |
|
} |
|
} |
|
return true |
|
}
|
|
|