2020-05-11 5 kyu Formatting a nu
Your objective is to add formatting to a plain number to display it as price.
The function should return a string like this:
var price = numberToPrice(13253.5123);
console.log(price); // 13,253.51
Numbers should use the standard comma for every 3 numbers and dot to separate the cents, cents need to be truncated to 2 decimals, in the case that the decimal part of the number is 1 character long or none you should add 0's so that the result will always have 2 decimal characters, the function will also evaluate negative numbers.
function should return a string 'NaN' if the input is not a valid number
My answer
var numberToPrice = function(number) {
if(!/^-?[0-9]+(\.)?([0-9]+)?$/.test(number))
return 'NaN';
minus = '';
if(number<0) minus = '-';
sn = Number(number.toString().match(/[0-9]+(\.[0-9]{0,2})?/)[0]).toFixed(2);
sna = sn.split('');
point = sna.indexOf('.');
for(let i=0; i<Math.floor(point/3); i++){
j = point-3*(i+1);
for(let k=sna.length+1; k>j; k--){
sna[k] = sna[k-1];
}
sna[j] = ','
}
if(sna[0]==',') sna.shift();
return minus+sna.join('');
}
Best answer
var numberToPrice = function(n) {
return typeof n != 'number' ? 'NaN' : n.toFixed(3).replace(/\d$/, '').replace(/(\d)(?=(?:\d{3})+\.)/g, '$1,')
}
好在哪?
- 使用
typeof
这个JS运算符来检测操作数据类型,快速进行判断 - 简短地使用了正则表达式来实现思路
- 使用会round的
toFixed()
保留三位小数,裁去最后一个小数 - 使用非捕捉组,将某个以数字开头并后面接上若干个三连的数字的该数字匹配出来(而其后的若干三连数字则不会被捕抓到),将其置换为该数字加逗号(
"$1,"
)
- 使用会round的
Recap
- 一道经典的字符串处理题,整数部分加千位逗号,两位小数之后都裁掉
- 传统的做法,循环遍历找逗号的插入点
- 正则还要加强,特别是非捕抓遍历(左括号后带问号的):
什么是捕获组?
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。一般一个小括号括起来就是一个捕获组。捕获组可以进行嵌套。以深度优先进行编号,在js中编号从1开始。
非捕获组是什么呢?
我的理解是参与匹配却不进行分组编号的捕获组,其形式为
(?:exp)
组成,还有其他的形式。
非捕获数组不参与编号分配但参与匹配
非捕获数组不参与编号分配但参与匹配
非捕获数组不参与编号分配但参与匹配
(?:),分到一个group里,会match出来,但是不能用$1
访问到;
(?=),分到一个group里,不会match出来,不能用$1
访问到;
- 肯定式向前查找
匹配字符序列Start后跟一个空格和Test字符序列(不区分大小写)
正则模式:Start(?= Test)
匹配字符序列some,如果在同一句子中还存在字符序列some
正则模式:some(?=.some.) - 否定式向前查找
匹配字符序列Start后面不存在test字符序列
正则模式:Start (?!test)
匹配Start 后面不存在test的行
正则模式: ^.Start((?!test).)$ - 肯定式向后查找
匹配前面有"rt"的字符序列Test
正则模式:(?<=rt )Test - 否定式向后查找
匹配前面没有"rt "的字符序列Test
正则模式:(?<!rt) Test
作者:一根弦的风筝
链接:https://www.jianshu.com/p/9fd05dfdde48
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
另外5个常用的JS运算符
-
delete
删除对象的属性; -
void
将后面的变量显示为undefined(仅返回undefined值,但不改变该变量的值); -
instanceof
测试对象类 -
in
测试属性是否存在 -
,
(逗号)忽略第一个操作数据,返回第二个操作数据。但是两者均会执行,通常用于声明多个变量时。
void "good"
// output: undefined
121, 434
// output: 434