一些小的方法工具

陸霸天發表於2018-10-24

銀行卡*格式化

//銀行卡格式化
   function bankCard(value) {
        value+=''
    	let v = value.replace(/(\d{4})(?=\d)/g, "$1 "), result;
    	const index = v.lastIndexOf(' ');
    	result = v.substring(0, index).replace(/\d/g, '*') + v.substring(index, v.length);
    	return result;
    }
    bankCard(12312312321) // "**** **** 321"
複製程式碼

Date操作

//獲取某一年中某一個月多少天
function getDaysInMonth (year, month) {
    <!--let ds = [2018, 02]-->
    const days = new Date(new Date(year + '/' + (month-0+1) + '/01').getTime() - 24 * 60 * 60 * 1000).getDate()    
    return days
}
getDaysInMonth(2018,2) // 28
複製程式碼
//獲取時間型別
const startTime = new Date(2018, 02, 11) //Sun Mar 11 2018 00:00:00 GMT+0800 (中國標準時間)
複製程式碼

數字操作

/**
 * 數字格式化
 * @param {number|sting} number 需格式化資料
 * @param {number} fixed 小數位
 * @param {boolean} thousand 千分符
 * @param {boolean} abs 絕對值
 */
function formatNumber (number, fixed = 0, thousand = false, abs = false) {
	let reg = /\B(?=(\d{3})+(?!\d))/g
	let num = 0

	// 處理後端返回帶千分符情況
	if (isNaN(number)) {
		num = Number(String(number).replace(/,/g, ''))
		if (isNaN(num)) return NaN
	} else num = Number(number)

	if (abs) num = Math.abs(num)

	num = num.toFixed(fixed)
	if (thousand) num = num.replace(reg, ',')

	return num
}
formatNumber(123321.432432, 2 , true) // "123,321.43"
複製程式碼

特殊的toString()

var a = 0.000001;  a.toString(); //'0.000001'
var b = 0.0000001;  b.toString();  // '1e-7'
parseInt(a) // 0
parseInt(b) // 1
// 解決方案來了
function newParseInt(value) {
    if(typeof value === 'number') {
    	return Math.floor(value);
    }
    return parseInt(value);
}

複製程式碼

常用的各種校驗

const verifications = {
    Reg: {
    	HTTP_URL: /^((https|http)?:\/\/)/, // 校驗http url
    	MOBILE: /^((\+86)|(86))?(1[3|4|5|7|8][0-9]\d{8})$/, // 手機號碼
    	CAR: /^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z0-9]{5}$/, // 車牌號
    	MAIL: /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/, // 郵箱
    	TEL: /^(([0\+]\d{2,3}-)?(0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$/, // 固話
    	DECIMAL: /^[0-9]+(\.[0-9]+)?$/, // 正數帶小數
    	INTEGER: /^[0-9]*$/, // 正整數
    	NEGATIVE: /^-[0-9]*$/, // 負整數
    	NUMBER: /^-?[0-9]+(\.[0-9]+)?$/ // 所有數字
    },
    checkDecimal (value) { // 校驗正數帶小數
    	if (value) {
    		if (!this.Reg.DECIMAL.test(value)) {
    			return '數字格式有誤'
    		} else { return 'success' }
    	} else {
    		return '不能為空'
    	}
    },
    checkInteger (value) { // 校驗正整數
    	if (value) {
    		if (!this.Reg.INTEGER.test(value)) {
    			return '數字格式有誤'
    		} else { return 'success' }
    	} else {
    		return '不能為空'
    	}
    },
    checkNegative (value) { // 校驗負整數
    	if (value) {
    		if (!this.Reg.NEGATIVE.test(value)) {
    			return '數字格式有誤'
    		} else { return 'success' }
    	} else {
    		return '不能為空'
    	}
    },
    checkNumber (value) { // 校驗數字
    	if (value) {
    		if (!this.Reg.NUMBER.test(value)) {
    			return '數字格式有誤'
    		} else { return 'success' }
    	} else {
    		return '不能為空'
    	}
    },
    checkHttp (value) { // 校驗HTTP_URL
    	if (value) {
    		if (!this.Reg.HTTP_URL.test(value)) {
    			return 'HTTP_URL格式有誤'
    		} else { return 'success' }
    	} else {
    		return '不能為空'
    	}
    },
    checkMobile (value) { // 校驗手機號
    	if (value) {
    		if (!this.Reg.MOBILE.test(value)) {
    			return '手機號碼格式有誤'
    		} else { return 'success' }
    	} else {
    		return '不能為空'
    	}
    },
    checkTel (value) { // 校驗固話
    	if (value) {
    		if (!this.Reg.TEL.test(value)) {
    			return '電話號碼格式有誤'
    		} else { return 'success' }
    	} else {
    		return '不能為空'
    	}
    },
    checkMail (value) { // 校驗郵箱
    	if (value) {
    		if (!this.Reg.MAIL.test(value)) {
    			return '郵箱格式有誤'
    		} else { return 'success' }
    	} else {
    		return '不能為空'
    	}
    },
    checkCar (value) { // 校驗車牌號
    	if (value) {
    		if (!this.Reg.CAR.test(value)) {
    			return '車牌號格式有誤'
    		} else { return 'success' }
    	} else {
    		return '不能為空'
    	}
    },
    checkID: function (e) { // 校驗身份證
    	let Errors = ['success',
    		'身份證號碼位數不正確',
    		'身份證號碼校驗錯誤']
    
    	e = e.toUpperCase()
    	if (!/(^\d{15}$)|(^\d{17}(\d|X)$)/.test(e)) {
    		return Errors[1]
    	}
    	let t, n
    	t = e.length
    	if (t === 15) {
    		n = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/)
    		let r = e.match(n)
    		let i = new Date('19' + r[2] + '/' + r[3] + '/' + r[4])
    		let s = i.getYear() === Number(r[2]) && i.getMonth() + 1 === Number(r[3]) && i.getDate() === Number(r[4])
    		if (!s) {
    			return Errors[2]
    		} else {
    			return Errors[0]
    		}
    	}
    	if (t === 18) {
    		n = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})(\d|X)$/)
    		let r = e.match(n)
    		let i = new Date(r[2] + '/' + r[3] + '/' + r[4])
    		let s = i.getFullYear() === Number(r[2]) && i.getMonth() + 1 === Number(r[3]) && i.getDate() === Number(r[4])
    		if (!s) {
    			return Errors[2]
    		} else {
    			let o
    			let u = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    			let a = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    			let f = 0
    			let l
    			for (l = 0; l < 17; l++) {
    				f += e.substr(l, 1) * u[l]
    			}
    			o = a[f % 11]
    			if (o !== e.substr(17, 1)) {
    				return Errors[2]
    			}
    			return Errors[0]
    		}
    	}
    	return Errors[2]
    },
    checkBank: function (bankno) { // 銀行卡格式校驗
    	let Errors = [
    		'success',
    		'銀行卡號長度必須在16到19之間',
    		'銀行卡號必須全為數字',
    		'銀行卡號開頭不符合規範',
    		'銀行卡號校驗失敗'
    	]
    	if (bankno.length < 16 || bankno.length > 19) {
    		return Errors[1]
    	}
    	// 開頭6位
    	let strBin = '10,18,19,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99' // 加了一個19
    	if (strBin.indexOf(bankno.substring(0, 2)) === -1) {
    		return Errors[3]
    	}
    	let lastNum = bankno.substr(bankno.length - 1, 1) // 取出最後一位(與luhm進行比較)
    
    	let first15Num = bankno.substr(0, bankno.length - 1) // 前15或18位
    	let newArr = []
    	for (let i = first15Num.length - 1; i > -1; i--) { // 前15或18位倒序存進陣列
    		newArr.push(first15Num.substr(i, 1))
    	}
    	let arrJiShu = [] // 奇數位*2的積 <9
    	let arrJiShu2 = [] // 奇數位*2的積 >9
    
    	let arrOuShu = [] // 偶數位陣列
    	for (let j = 0; j < newArr.length; j++) {
    		if ((j + 1) % 2 === 1) { // 奇數位
    			if (parseInt(newArr[j]) * 2 < 9) { arrJiShu.push(parseInt(newArr[j]) * 2) } else { arrJiShu2.push(parseInt(newArr[j]) * 2) }
    		} else { // 偶數位
    			arrOuShu.push(newArr[j])
    		}
    	}
    
    	let jishuChild1 = [] // 奇數位*2 >9 的分割之後的陣列個位數
    	let jishuChild2 = [] // 奇數位*2 >9 的分割之後的陣列十位數
    	for (let h = 0; h < arrJiShu2.length; h++) {
    		jishuChild1.push(parseInt(arrJiShu2[h]) % 10)
    		jishuChild2.push(parseInt(arrJiShu2[h]) / 10)
    	}
    
    	let sumJiShu = 0 // 奇數位*2 < 9 的陣列之和
    	let sumOuShu = 0 // 偶數位陣列之和
    	let sumJiShuChild1 = 0 // 奇數位*2 >9 的分割之後的陣列個位數之和
    	let sumJiShuChild2 = 0 // 奇數位*2 >9 的分割之後的陣列十位數之和
    	let sumTotal = 0
    	for (let m = 0; m < arrJiShu.length; m++) {
    		sumJiShu = sumJiShu + parseInt(arrJiShu[m])
    	}
    
    	for (let n = 0; n < arrOuShu.length; n++) {
    		sumOuShu = sumOuShu + parseInt(arrOuShu[n])
    	}
    
    	for (let p = 0; p < jishuChild1.length; p++) {
    		sumJiShuChild1 = sumJiShuChild1 + parseInt(jishuChild1[p])
    		sumJiShuChild2 = sumJiShuChild2 + parseInt(jishuChild2[p])
    	}
    	// 計算總和
    	sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu) + parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2)
    
    	// 計算Luhm值
    	let k = parseInt(sumTotal) % 10 === 0 ? 10 : parseInt(sumTotal) % 10
    	let luhm = 10 - k
    	if (String(lastNum) === String(luhm)) {
    		return Errors[0]
    	} else {
    		return Errors[4]
    	}
    }
    
    }
複製程式碼

圖片壓縮

/**
 * 圖片壓縮
 * @param {DOMObject|string} img dom物件、圖片連結、base64
 * @param {number} percent 壓縮比例 0-1
 * @returns {promise|string}
 */
function imageCompress (image, percent) {
    if (typeof(image) === 'string') {
    	return new Promise((resolve, reject) => {
    		let $img = document.createElement('img')
    		$img.src = image
    		$img.onload = () => resolve(compress($img, percent))
    		$img.onerror = (err) => reject(err)
    	})
    } else {
    	return compress(image, percent)
    }
}

/**
 * 圖片壓縮
 * @param {DOMObject} img dom物件
 * @param {number} percent 壓縮比例 0-1
 */
function compress (image, percent) {
	let canvas = document.createElement('canvas')
	let context = canvas.getContext('2d')
	let naturalHeight = image.naturalHeight
	let naturalWidth = image.naturalWidth

	// 設定 canvas 寬高
	canvas.setAttribute('width', naturalWidth)
	canvas.setAttribute('height', naturalHeight)
	context.drawImage(image, 0, 0, naturalWidth, naturalHeight)

	return canvas.toDataURL('image/jpeg', +percent.toFixed(4))
}
複製程式碼

相關文章