【问题标题】:Addition of number string in javascript with leading zeros在javascript中添加带有前导零的数字字符串
【发布时间】:2020-08-11 08:54:57
【问题描述】:

以下是我的代码,除了前导零之外,它在大多数情况下都可以正常工作。它应该保留尾随零,例如 -001 + 1 = 002

代码-

function incrementString (str) {
  if(str === '') return "1";
  
  if(!str.slice(-1).match(/\d/)) return `${str}1`;
  
  const replacer = x => {
    // Check if number 
    return (parseInt(x) + 1).toString();
  }
  
  return str.replace(/\d+/g, replacer )
}

// Return foobar2 which is correct
console.log(incrementString("foobar1"))

// Return foobar100 which is correct
console.log(incrementString("foobar099"))

// Return foobar2 which is incorrect, is should be foobar002
console.log(incrementString("foobar001"))

// Return foobar1 which is incorrect, is should be foobar001
console.log(incrementString("foobar000"))

// Return foobar101 which is incorrect, is should be foobar0101
console.log(incrementString("foobar0100"))

【问题讨论】:

    标签: javascript html regex reactjs ecmascript-6


    【解决方案1】:

    您可以使用这个正则表达式解决方案:

    function incrementString (str) {
      if(str === '') return "1";
      
      if(!str.slice(-1).match(/\d/)) return `${str}1`;
      
      const replacer = (m, g1, g2) => {
        // Check if number 
        var nn = (g1?g1:"") + (parseInt(g2) + 1).toString()
        return nn.slice(-1 * m.length)
    
      }
      
      return str.replace(/(0*)(\d+)/g, replacer )
    }
    
    // Return foobar2
    console.log(incrementString("foobar1"))
    
    // Return foobar100
    console.log(incrementString("foobar099"))
    
    // Return foobar002
    console.log(incrementString("foobar001"))
    
    // Return foobar001
    console.log(incrementString("foobar000"))
    
    // Return foobar0101
    console.log(incrementString("foobar0100"))
    
    // Return foobar01000
    console.log(incrementString("foobar00999"))
    
    // Return foobar010
    console.log(incrementString("foobar009"))

    【讨论】:

    • 感谢/(0*)(\d+)/...我错过了这部分。
    • 这是错误的顺便说一句 - incrementString("foobar099") 它正在制作 0100
    • foobar0100 变为 foobar0101foobar0999 变为 foobar1000 表示 0 应保持到以下数字不超过其递增限制的时间 -> foobar0000100 变为 foobar0000101 & foobar0000999 变为 foobar0001000
    • 我希望我为你提供了一个合理的解释。老实说,我没有考虑零,而是增加,但这是问题陈述:(
    • Expected: 'foobar01000', instead got: 'foobar001000', Expected: '010', instead got: '0010'
    【解决方案2】:

    一切似乎都很完美,您只需要处理replacer 函数中前导零的正则表达式部分。下面是相同的更新代码。

    function incrementString(str) {
      if (str === '')
        return "1";
    
      if (!str.slice(-1).match(/\d/)) {
        return `${str}1`;
      }
    
      const replacer = x => {
        var leadingZerosMatched = x.match(/^0+/);
        var incrementedNumber = (parseInt(x) + 1).toString();
        var leadingZeroes;
        if (leadingZerosMatched && incrementedNumber.length < x.length) {
          leadingZeroes = leadingZerosMatched[0];
          if(leadingZeroes.length === x.length) {
            leadingZeroes = leadingZeroes.slice(0, leadingZeroes.length-1)
          }
        }
        return leadingZeroes ? leadingZeroes + incrementedNumber : incrementedNumber;
      }
      return str.replace(/\d+/g, replacer)
    }
    

    【讨论】:

      【解决方案3】:

      您可以将字符串与数字分开,并在增量后使用padStart 以保留前导0

      const incrementString = (str) => {
        const [chars, nums] = str.split(/(\d+)/)
      
        return [
          ...chars, 
          String(Number(nums) + 1)
          .padStart(nums.length, '0')
        ].join('')
      }
      
      console.log(incrementString("foobar1"))
      
      console.log(incrementString("foobar099"))
      
      console.log(incrementString("foobar001"))
      
      console.log(incrementString("foobar000"))
      
      console.log(incrementString("foobar0100"))

      【讨论】:

        【解决方案4】:

        function incrementString (str) {
          let [
            openingPartial,
            terminatingInt
          ] = str.split(/(\d*)$/);
        
          if (terminatingInt) {
            const incrementedInt = String(parseInt(terminatingInt, 10) + 1);
            const leadingZeroCount = (terminatingInt.length - incrementedInt.length);
        
            if (leadingZeroCount >= 1) {
        
              terminatingInt = Array(leadingZeroCount).fill("0").concat(incrementedInt).join('');
            } else {
              terminatingInt = incrementedInt;
            }
          } else {
            terminatingInt = '1';
          }
          return `${ (openingPartial || '') }${ terminatingInt }`;
        }
        
        // Should return 'foo_003_bar1'.
        console.log(incrementString("foo_003_bar"));
        
        // Should return 'foo_003_bar_01'.
        console.log(incrementString("foo_003_bar_00"));
        
        // Should return 'foobar1'.
        console.log(incrementString("foobar"));
        
        // Should return 'foobar2'.
        console.log(incrementString("foobar1"));
        
        // Should return 'foobar100'.
        console.log(incrementString("foobar099"));
        
        // Should return 'foobar002'.
        console.log(incrementString("foobar001"));
        
        // Should return 'foobar001'.
        console.log(incrementString("foobar000"));
        
        // Should return 'foobar0101'.
        console.log(incrementString("foobar0100"));
        .as-console-wrapper { max-height: 100%!important; top: 0; }

        【讨论】:

          猜你喜欢
          • 2017-08-12
          • 2018-01-17
          • 1970-01-01
          • 1970-01-01
          • 2014-07-13
          • 2013-03-29
          • 1970-01-01
          相关资源
          最近更新 更多