当前的问题
发现parseFloat(234234).toLocaleString()
在给金额添加千分符的时候,safari浏览器会无效,包括ios中的webview中同样无效。
解决方式一:采用纯正则的方式(Safari报错)
<code class="language-null">//采用零宽断言 '12345678.56'.replace(/\d{1,3}(?=(\d{3})+(\.\d+)*$)/g, '$&,').replace(/(?<=\.(\d+\,)*\d+),/g, '') //输出"12,345,678.56" </code>
正则主要使用后向引用,采用replace(/\d{1,3}(?=(\d{3})+(\.\d+)*$)/g, '$&,')
匹配前面有三个数字的部分,并添加逗号;使用replace(/(?<=\.(\d+\,)*\d+),/g, '')
替换掉小数点后面的逗号。
- (?=exp) 匹配exp前面的位置
- (?<=exp) 匹配exp后面的位置
- (?!exp) 匹配后面跟的不是exp的位置
- (?<!exp) 匹配前面不是exp的位置
参考正则表达式后向引用详解
正则中还使用了replace的$&引用,规则如下:
字符 | 替换文本 |
---|---|
$1、$2、...、$99 | 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
$& | 与 regexp 相匹配的子串。 |
$` | 位于匹配子串左侧的文本。 |
$' | 位于匹配子串右侧的文本。 |
$$ | 直接量符号。 |
这种方式Chrome下可以正常工作,但是Safari下会报错:Invalid regular expression: unrecognized character after (?
,第二个正则报错了。
虽然上面的实现方式看起来挺优雅,然并卵,safari下正则报错,仍旧不能解决问题。
解决方式二:采用半正则半拼接的方式
<code class="language-javascript">//封装的函数 function money2String(amount){ let amount_arr = amount.toString().split('.'); amount_arr[0] = amount_arr[0].replace(/\d{1,3}(?=(\d{3})+(\.\d+)*$)/g, '$&,'); return amount_arr.join('.'); } </code>
此方法Safari和Chrome均可用,没啥好讲的,over。