isint.mjs

import get from 'lodash-es/get.js'
import isInteger from 'lodash-es/isInteger.js'
import isbol from './isbol.mjs'
import isnum from './isnum.mjs'
import cdbl from './cdbl.mjs'


/**
 * 判斷是否為整數
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/isint.test.mjs Github}
 * @memberOf wsemi
 * @param {*} v 輸入任意資料
 * @param {Object} [opt={}] 輸入設定物件,預設{}
 * @param {Boolean} [opt.useLimitSafe=false] 輸入是否限制須為安全整數布林值,若為true則超出安全整數範圍者(即Number.isSafeInteger為false,含Infinity、-Infinity與絕對值大於Number.MAX_SAFE_INTEGER者)判定為false,預設false
 * @returns {Boolean} 回傳判斷布林值
 * @example
 *
 * console.log(isint('1.25'))
 * // => false
 *
 * console.log(isint('125'))
 * // => true
 *
 * console.log(isint(1.25))
 * // => false
 *
 * console.log(isint(125))
 * // => true
 *
 * console.log(isint(Infinity))
 * // => true
 *
 * console.log(isint(Infinity, { useLimitSafe: true }))
 * // => false
 *
 */
function isint(v, opt = {}) {

    //useLimitSafe
    let useLimitSafe = get(opt, 'useLimitSafe', null)
    if (!isbol(useLimitSafe)) {
        useLimitSafe = false
    }

    if (isnum(v)) {
        v = cdbl(v)
        if (useLimitSafe) {
            //因cdbl對Infinity與超出範圍數值會轉為Number.MAX_VALUE, 而其為lodash之整數故isInteger仍為true, 須改用Number.isSafeInteger方能排除
            return Number.isSafeInteger(v)
        }
        else {
            return isInteger(v)
        }
    }
    else {
        return false
    }
}


export default isint