銀行卡*格式化
//銀行卡格式化
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))
}
複製程式碼