金额添加千分符

当前的问题

发现parseFloat(234234).toLocaleString()在给金额添加千分符的时候,safari浏览器会无效,包括ios中的webview中同样无效。

解决方式一:采用纯正则的方式(Safari报错)

<code class="language-null">//采用零宽断言
'12345678.56'.replace(/\d{1,3}(?=(\d{3})+(\.\d+)*$)/g, '$&amp;,').replace(/(?&lt;=\.(\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 相匹配的子串。
$` 位于匹配子串左侧的文本。
$' 位于匹配子串右侧的文本。
$$ 直接量符号。

参考JavaScript replace() 方法

这种方式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, '$&amp;,');
    return amount_arr.join('.');
}
</code>

此方法Safari和Chrome均可用,没啥好讲的,over。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>