摘要:實現(xiàn)思路使用正則,用數(shù)字中的小數(shù)點做匹配尾部參考,來匹配某個數(shù)字后面的一個或多個連續(xù)位數(shù)字,如果匹配到把該數(shù)字替換成自身加分隔符,如下示例分隔數(shù)字解釋和之間有一個連續(xù)位數(shù)字,那么給后面添加一個分隔符得到結果。
功能:可實現(xiàn)不同符號分隔數(shù)字,可自定義分隔后數(shù)字保留的小數(shù)位數(shù)。
????使用正則,用數(shù)字中的小數(shù)點做匹配尾部參考,來匹配某個數(shù)字后面的一個或多個連續(xù)3位數(shù)字,如果匹配到把該數(shù)字替換成自身加分隔符,如下:
示例
1、 分隔數(shù)字:123456.1
解釋:3和.之間有一個連續(xù)3位數(shù)字(456),那么給3后面添加一個分隔符得到結果:123,456.1。
2、分隔數(shù)字:1234567.1
解釋:1和.之間有兩個連續(xù)3位數(shù)字(234和567),那么給1后面添加一個分隔符,然后數(shù)字4后面也存在一個連續(xù)三位數(shù)字(567),那么也給4后面添加一個分隔符,最終得到結果1,234,567.1
/(d)(?=(d{3})+.)/g; 這里最難理解的就是(?=(d{3})+.),且看語法: x(?=y):正向肯定查找,匹配后面帶有y的x項目 那么在這里意思是:查找一個和“.”之間帶有一個或多個連續(xù)3位數(shù)字的數(shù)字(x)
/** *num 要分隔的數(shù)字(必填) *n 保留的小數(shù)位數(shù)(可選) *symbol 分隔數(shù)字使用的符號(可選,默認為",") */ function splitNum(num,n,symbol) { if(!num)throw new Error("splitNum需要傳入一個待轉換的數(shù)據(jù)"); if(typeof num!=="number")throw new TypeError("num參數(shù)應該是一個number類型"); if(n<0)throw new Error("參數(shù)n不應該小于0"); var hasDot=parseInt(num)!=num;//這里檢測num是否為小數(shù),true表示小數(shù) var m=(n!=undefined&&n!=null)?n:1; num=m==0?num.toFixed(m)+".":hasDot?(n?num.toFixed(n):num):num.toFixed(m); symbol=symbol||","; num=num.toString().replace(/(d)(?=(d{3})+.)/g,function(match, p1,p2) { return p1 + symbol; }); if(n==0||(!hasDot&&!n)){//如果n為0或者傳入的num是整數(shù)并且沒有指定整數(shù)的保留位數(shù),則去掉前面操作中的小數(shù)位 num=num.substring(0,num.indexOf(".")); } return num; }
難點解惑
1、也許有人會問,這里是用“.”號做參考進行匹配的,如果傳進來的數(shù)字是一個整數(shù)呢,不就沒“.”號了嗎,所以在方法內(nèi)部定義了m變量使其在操作過程中總能有個“.”號。
2、num=m==0?num.toFixed(m)+".":hasDot?(n?num.toFixed(n):num):num.toFixed(m);
num=m==0?num.toFixed(m)+".":hasDot?(n?num.toFixed(n):num):num.toFixed(m); 作用:這里的操作保證的是小數(shù)傳n、小數(shù)不傳n、整數(shù)傳n、整數(shù)不傳n四種情況都能正確返回小數(shù)位數(shù) 詳解: 1、如果m為零(傳入n=0)則直接經(jīng)toFixed操作后再后面補“.” 2、如果m不為0, a、如果傳入數(shù)為小數(shù) a"、如果傳了n表示要保留小數(shù),那么需要num.toFixed(n) b"、如果沒傳n表示不需要對小數(shù)進行操作,直接返回原num b、如果傳入數(shù)為整數(shù) a"、直接對num進行toFixed(m)操作
說明:該方法只適用于常用數(shù)字的操作,當數(shù)字超過一定位數(shù)時產(chǎn)生的精度問題這里暫不做處理
自己寫的方法,如果有什么不足之處歡迎指出交流,這里的replace方法可參考我的另一篇文章補充:更簡單的原生方法
number類型可調(diào)用toLocalString()方法把他轉成本地語言環(huán)境格式顯示,經(jīng)測試是可行的,但不需要攜帶參數(shù),因為這些參數(shù)還是具有一定兼容性問題的,直接可以像下面使用,具體參見MDN:
var number=1234567891.23; console.log(number.toLocaleString());//1,234,567,891.23
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/107264.html
摘要:前言本章介紹數(shù)值的擴展。本章原文鏈接數(shù)值的擴展進制表示法提供了二進制和八進制數(shù)值的新的寫法,分別用前綴或和或表示。科學計數(shù)法里面,表示指數(shù)的或前后不能有分隔符。函數(shù)返回數(shù)值的雙曲余弦函數(shù)可用表示。與數(shù)值的類型不同。 前言本章介紹數(shù)值的擴展。新增了很多方法,有些不常用的方法了解即可。本章原文鏈接:數(shù)值的擴展進制表...
摘要:上次講到是如何解析大整數(shù)的,一筆帶過了的處理,再詳細閱讀該函數(shù)的源碼,以下是小分析。總結閱讀完這個函數(shù)的源碼,學習到的是浮動數(shù)與字符串的互相轉換的實現(xiàn)細節(jié),字符串與浮點數(shù)之間的關系較復雜,之后還要繼續(xù)學習。 上次講到PHP是如何解析大整數(shù)的,一筆帶過了number_format的處理,再詳細閱讀該函數(shù)的源碼,以下是小分析。 函數(shù)原型 string number_format ( flo...
摘要:對于對象,方法返回一個該正則表達式的字面量。顯示顯示正則表達式在的應用一個在字符串中執(zhí)行查找匹配的方法,它返回一個數(shù)組或者在未匹配到時返回。 為什么要用正則表達式 簡單的說:我們與字符串接觸的頻率非常之高,正則表達式可以極大的提高復雜文本分析的效率,快速匹配出復雜的字符串。 創(chuàng)建一個正則表達式 直接量語法(字面量) var expression = /pattern/flags ;...
摘要:正則引言正則是一個前端必須掌握的知識。但是由于用的少,忘了記,記了忘,導致面試經(jīng)常坐蠟。這里上篇先介紹正則的規(guī)則,下篇結合一些具體題目,帶大家重新學習鞏固一下正則,爭取面試給自己加分。 正則 showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 正則是一個前端必須掌握的知識。但是由于用的少,忘了記,記了忘,導致面...
閱讀 2605·2021-11-25 09:43
閱讀 2767·2021-11-16 11:50
閱讀 3384·2021-10-09 09:44
閱讀 3320·2021-09-26 09:55
閱讀 2908·2019-08-30 13:50
閱讀 1105·2019-08-29 13:24
閱讀 2152·2019-08-26 11:44
閱讀 2924·2019-08-26 11:37