2020-05-11 5 kyu Formatting a nu

2020-05-11  本文已影响0人  苦庭

https://www.codewars.com/kata/formatting-a-number-as-price

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,')
}

好在哪?

Recap

什么是捕获组?

捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。一般一个小括号括起来就是一个捕获组。捕获组可以进行嵌套。以深度优先进行编号,在js中编号从1开始。

非捕获组是什么呢?

我的理解是参与匹配却不进行分组编号的捕获组,其形式为(?:exp)组成,还有其他的形式。

非捕获数组不参与编号分配但参与匹配
非捕获数组不参与编号分配但参与匹配
非捕获数组不参与编号分配但参与匹配

(?:),分到一个group里,会match出来,但是不能用$1访问到;
(?=),分到一个group里,不会match出来,不能用$1访问到;

  1. 肯定式向前查找
    匹配字符序列Start后跟一个空格和Test字符序列(不区分大小写)
    正则模式:Start(?= Test)
    匹配字符序列some,如果在同一句子中还存在字符序列some
    正则模式:some(?=.some.)
  2. 否定式向前查找
    匹配字符序列Start后面不存在test字符序列
    正则模式:Start (?!test)
    匹配Start 后面不存在test的行
    正则模式: ^.Start((?!test).)$
  3. 肯定式向后查找
    匹配前面有"rt"的字符序列Test
    正则模式:(?<=rt )Test
  4. 否定式向后查找
    匹配前面没有"rt "的字符序列Test
    正则模式:(?<!rt) Test

作者:一根弦的风筝
链接:https://www.jianshu.com/p/9fd05dfdde48
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

另外5个常用的JS运算符

  1. delete 删除对象的属性;
  2. void 将后面的变量显示为undefined(仅返回undefined值,但不改变该变量的值);
  3. instanceof 测试对象类
  4. in 测试属性是否存在
  5. , (逗号)忽略第一个操作数据,返回第二个操作数据。但是两者均会执行,通常用于声明多个变量时。
void "good"
// output: undefined
121, 434
// output: 434
上一篇 下一篇

猜你喜欢

热点阅读