Vue自定義指令實(shí)現(xiàn)對(duì)數(shù)字進(jìn)行千分位分隔
說在前面
對(duì)數(shù)字進(jìn)行千分位分隔后展示應(yīng)該是大部分同學(xué)都做過的功能了吧,常規(guī)的做法通常是編寫一個(gè)工具函數(shù)來對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換,那么我們可不可以通過vue指令
來實(shí)現(xiàn)這一功能呢?
效果展示
實(shí)現(xiàn)原理
非輸入框
非輸入框我們只需要對(duì)其展示進(jìn)行處理,我們可以判斷綁定元素的innerHTML
是否不為空,不為空的話則直接對(duì)其innerHTML
內(nèi)容進(jìn)行格式化。
export default { bind: function (el, binding) { const separator = binding.value || ","; if (el.innerHTML) { el.innerHTML = addThousandSeparator(el.innerText, separator); } }, };
輸入框
對(duì)于輸入框,我們希望其有以下功能:
1、輸入的時(shí)候去掉分隔符
這里我們只需要監(jiān)聽元素的聚焦(focus)
事件即可,取到元素的值,將其分隔符去掉后重新賦值。
el.addEventListener("focus", (event) => { const value = event.target.value; event.target.value = deleteThousandSeparator(value, separator); });
2、輸入完成后添加分隔符
這里我們只需要監(jiān)聽元素的失焦(blur)
事件即可,取到元素的值,對(duì)其進(jìn)行添加分隔符處理后重新賦值。
el.addEventListener("blur", (event) => { const value = event.target.value; event.target.value = addThousandSeparator(value, separator); });
千分位分隔函數(shù)
function addThousandSeparator(num, separator = ",") { return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, separator); }
num.toString(): 將輸入的數(shù)字 num 轉(zhuǎn)換為字符串,以便后續(xù)處理。
.replace(/\B(?=(\d{3})+(?!\d))/g, separator): 這里使用了正則表達(dá)式進(jìn)行替換操作。具體解釋如下:
- \B: 表示非單詞邊界,用于匹配不在單詞邊界處的位置。
- (?=(\d{3})+(?!\d)): 使用正向預(yù)查來匹配每三位數(shù)字的位置,但不匹配末尾不足三位的數(shù)字。
- (\d{3})+: 匹配連續(xù)的三位數(shù)字。
- separator: 作為參數(shù)傳入的分隔符,默認(rèn)為 ,。
- g: 表示全局匹配,即匹配所有滿足條件的位置。
這樣,通過正則表達(dá)式的替換功能,在數(shù)字字符串中的每三位數(shù)字之間插入指定的千位分隔符,從而實(shí)現(xiàn)千位分隔符的添加。
去掉千分位分隔
function deleteThousandSeparator(numberString, separator = ",") { return numberString.replace(new RegExp(separator, "g"), ""); }
直接將字符串中的分隔符全部替換為空即可。
完整代碼
function addThousandSeparator(num, separator = ",") { return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, separator); } function deleteThousandSeparator(numberString, separator = ",") { return numberString.replace(new RegExp(separator, "g"), ""); } export default { bind: function (el, binding) { const separator = binding.value || ","; if (el.innerHTML) { el.innerHTML = addThousandSeparator(el.innerText, separator); } el.addEventListener("focus", (event) => { const value = event.target.value; event.target.value = deleteThousandSeparator(value, separator); }); el.addEventListener("blur", (event) => { const value = event.target.value; event.target.value = addThousandSeparator(value, separator); }); }, };
組件庫(kù)
組件文檔
目前該組件也已經(jīng)收錄到我的組件庫(kù),組件文檔地址如下:http://jyeontu.xyz/jvuewheel/#/JThousandView
組件內(nèi)容
組件庫(kù)中還有許多好玩有趣的組件,如:
- 懸浮按鈕
- 評(píng)論組件
- 詞云
- 瀑布流照片容器
- 視頻動(dòng)態(tài)封面
- 3D輪播圖
- web桌寵
- 貢獻(xiàn)度面板
- 拖拽上傳
- 自動(dòng)補(bǔ)全輸入框
- 圖片滑塊驗(yàn)證
等等……
組件庫(kù)源碼
組件庫(kù)已開源到gitee,有興趣的也可以到這里看看:https://gitee.com/zheng_yongtao/jyeontu-component-warehouse
以上就是Vue自定義指令實(shí)現(xiàn)對(duì)數(shù)字進(jìn)行千分位分隔的詳細(xì)內(nèi)容,更多關(guān)于Vue數(shù)字千位分隔的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
element中el-autocomplete的常見用法示例
這篇文章主要給大家介紹了關(guān)于element中el-autocomplete的常見用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用element具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03vue2前端使用axios發(fā)起post請(qǐng)求后端(springboot)接收不到值解決辦法
這篇文章主要介紹了vue2前端使用axios發(fā)起post請(qǐng)求后端(springboot)接收不到值解決辦法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-03-03vue項(xiàng)目如何修改title旁邊的icon圖片
這篇文章主要介紹了vue項(xiàng)目如何修改title旁邊的icon圖片,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12使用elementUI實(shí)現(xiàn)將圖片上傳到本地的示例
今天小編就為大家分享一篇使用elementUI實(shí)現(xiàn)將圖片上傳到本地的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue 集成 vis-network 實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D的方法
這篇文章主要介紹了vue 集成 vis-network 實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì) ,需要的朋友可以參考下2019-08-08Vue數(shù)據(jù)驅(qū)動(dòng)模擬實(shí)現(xiàn)1
這篇文章主要介紹了Vue數(shù)據(jù)驅(qū)動(dòng)模擬實(shí)現(xiàn)的相關(guān)資料,允許采用簡(jiǎn)潔的模板語法聲明式的將數(shù)據(jù)渲染進(jìn)DOM,且數(shù)據(jù)與DOM綁定在一起,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01重新認(rèn)識(shí)vue之事件阻止冒泡的實(shí)現(xiàn)
這篇文章主要介紹了重新認(rèn)識(shí)vue之事件阻止冒泡的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08