最近用echart作金融報表系統,作了三十來個頁面以後提出要讓數據以千分位形式顯示;函數
頁面既有表格又有echart圖表,傳入到echart的數據若是直接就帶了",",那必將沒法顯示。spa
最後我作了一個過濾器和一個公用函數;過濾器給表格用,公用函數給echart使用(用在label和tooltip的formatter回調函數中)。code
將數據每三位用逗號分隔的函數:orm
function formatNum(value) { if(!value&&value!==0) return 0; let str = value.toString(); let reg = str.indexOf(".") > -1 ? /(\d)(?=(\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g; return str.replace(reg,"$1,");
}
這個函數裏的正則是從網上copy來,看到好多個博客用了相似的正則,可是無一例外沒有看到相應的解析,
由於對正則的瞭解不夠深,再加上不喜歡把沒有理解的東西直接拿來用,我解讀了很久,同時屢次修改正則並查看控制檯結果後,纔將它理解:
大概是這個意思:
從整數部分的後面向前查找(即從個位開始往前),
查找3個整數前面的那個數字,即至關於:從後向前,每3個數字爲一組分組,而後把目標定位在這3個數字前的那一個數字
(假定這個數字爲x,這個x即等同於replace方法中的$1,這個$1也就是指正則中的(\d),把它替換爲「它自己+逗號」(即replace方法中的「$1,」)
接下來咱們一點點分析這行正則裏面每一個成分的含義:
(1)如何理解$1的含義:
()表示捕獲分組,()會把每一個分組裏的匹配的值保存起來,使用:$n(n是一個數字,表示第n個捕獲組的內容)
(?:)表示非捕獲分組,和捕獲分組惟一的區別在於,非捕獲分組匹配的值不會保存起來(能夠提升程序執行速度)
w3school有$1,$2...的例子:
//把 "Doe, John" 轉換爲 "John Doe":
var str = "Doe, John";
str.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
//$1,$2:按順序對應小括號裏面的正則捕獲到的內容。 (即$1對應第一個(\w+),$2對應第二個(\w+))
補充(摘自他人的博客):
「?:」非獲取匹配,匹配冒號後的內容但不獲取匹配結果,不進行存儲供之後使用。(能夠提升程序執行速度)
單獨的「?」:匹配前面的子表達式零次或一次。
當「?」緊跟在任何一個其餘限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘量少地匹配所搜索的字符串,而默認的貪婪模式則儘量多地匹配所搜索的字符串。
(2)?=的含義(整合自他人的博客):
首先要了解下正則的前瞻後顧
前瞻的形式爲:
(?=pattern) 爲確定式前瞻,(?!pattern) 爲否認式前瞻
後顧則用的比較少,形式爲
(?<=pattern) 確定式後顧 , (?<!pattern)否認式後顧
更具體來講:
前瞻:
exp1(?=exp2) 查找exp2前面的exp1
後顧:
(?<=exp2)exp1 查找exp2後面的exp1
負前瞻:
exp1(?!exp2) 查找後面不是exp2的exp1
負後顧:
(?<!exp2)exp1 查找前面不是exp2的exp1
再看一個小demo:
"好可愛".replace(/(?<=好)可愛/, "可愛的我") // 匹配"好可愛"中的"可愛",將其替換爲"可愛的我",結果爲"好可愛的我"
"不可愛".replace(/(?<=好)可愛/, "可愛的我") // 結果爲"不可愛",由於"可愛"前面不是"好",因此沒法匹配到。。。。不當心點了發佈,未完待續,上文還不夠詳盡。