美文网首页
2020-05-11 5 kyu Formatting a nu

2020-05-11 5 kyu Formatting a nu

作者: 苦庭 | 来源:发表于2020-05-11 17:50 被阅读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,')
    }
    

    好在哪?

    • 使用typeof这个JS运算符来检测操作数据类型,快速进行判断
    • 简短地使用了正则表达式来实现思路
      1. 使用会round的toFixed()保留三位小数,裁去最后一个小数
      2. 使用非捕捉组,将某个以数字开头并后面接上若干个三连的数字的该数字匹配出来(而其后的若干三连数字则不会被捕抓到),将其置换为该数字加逗号("$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
    

    相关文章

      网友评论

          本文标题:2020-05-11 5 kyu Formatting a nu

          本文链接:https://www.haomeiwen.com/subject/evfpnhtx.html