頁面顯示的數據千分位處理,包括echart數據千分位處理(將數據每三位用逗號分隔)

最近用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(/(?<=好)可愛/, "可愛的我") // 結果爲"不可愛",由於"可愛"前面不是"好",因此沒法匹配到。。。。不當心點了發佈,未完待續,上文還不夠詳盡。
相關文章
相關標籤/搜索