Изменить число в строке javascript

301
15 февраля 2018, 17:11

Здравствуйте, такая задача: нужно написать функцию, которая будет выводить измененную строку, а именно если мы получаем строку 'foo' -> 'foo1', 'foo000' -> 'foo001', 'foo001' -> 'foo002', 'foo99' -> 'foo100', 'foo099' -> 'foo100'

Написал такую функцию, но потом понял, что эта функция меняет только последнюю цифру в строке. И теперь не могу понять как прибавлять единицу к числам 001, 099 и т.д. , чтобы когда нужно нули оставались(077 -> 078), а когда не нужны то уходили(099 -> 100)

function incrementString (strng) { 
  var numbOfString = strng.match(/[0-9]/ig); 
  var numbArray = []; 
 
  if (/[0-9]/i.test(strng)) { 
    for (var i = 0; i < numbOfString.length; i++) { 
      numbArray.push(parseInt(numbOfString[i])); 
    } 
 
    var lastAddValue = numbArray[numbArray.length - 1] + 1; 
 
    var editedStrng = strng.slice(0, -1); 
    editedStrng = editedStrng + lastAddValue; 
    return editedStrng; 
  }  
  return strng + '1'; 
}

UPD: цифры могут быть только в конце строки. Сколько цифр в строке будет неизвестно, строка может быть и такой foo00000001

Answer 1

Чтобы было максимально легко разобраться, я постарался лишь модифицировать ваш пример:

function incrementString(strng, base, decrease) { 
  var base = base || 3; 
 
  var numbOfString = strng.match(/[0-9]/ig); 
  var numbArray = ''; 
 
  if (/[0-9]/i.test(strng)) { 
    for (var i = 0; i < numbOfString.length; i++) { 
      numbArray += numbOfString[i]; 
    } 
 
    numbArray = parseInt(numbArray); 
 
    var lastAddValue = numbArray + (decrease? -1 : 1); 
    return strng.replace(/\d/g, '') + pad(lastAddValue, base); 
  } 
  return strng + pad(1, base); 
} 
 
function pad(num, size) { 
  var s = num + ""; 
  while (s.length < size) s = "0" + s; 
  return s; 
} 
 
console.log(incrementString('foo', 1)); 
console.log(incrementString('foo000')); 
console.log(incrementString('foo001')); 
console.log(incrementString('foo077')); 
console.log(incrementString('foo089', 2)); 
console.log(incrementString('foo099')); 
console.log(incrementString('foof099', 3, true)); 
console.log(incrementString('foof100', 3, true)); 
console.log(incrementString('foof60', 3, true));

Добавилось 2 параметра:

  • основание (base), указывающее, сколько цифр должно быть в итоговой строке. Если не передан, то будет равняться 3.
  • необязательный флаг decrease, указывающий, что необходимо уменьшение счетчика, а не увеличение

Хочу отметить, что тут имеется весьма забавный... ммм "артефакт".

Так как регулярное выражение тут требует доработки, переданная строка, например такая, тоже отработает и выведет нужный результат:

console.log(incrementString('1f2o3o', 3));

foo124

Я специально назвал это "артефактом", так как кто-то может расценить это как фичу, а кто-то как баг =)

UPD после комментариев

function incrementString(strng, decrease) { 
 
  var numbOfString = strng.match(/[0-9]/ig); 
  var number; 
   
  if (numbOfString) { 
    number = +numbOfString.join(''); 
 
    var lastAddValue = number + (decrease? -1 : 1); 
    return strng.replace(/\d/g, '') + pad(lastAddValue, numbOfString.length); 
  } 
  return strng + pad(1, 1); 
} 
 
function pad(num, size) { 
  var s = num + ""; 
  while (s.length < size) s = "0" + s; 
  return s; 
} 
 
console.log(incrementString('foo', 1)); 
console.log(incrementString('foo000')); 
console.log(incrementString('foo001')); 
console.log(incrementString('foo077')); 
console.log(incrementString('foo089')); 
console.log(incrementString('foo099')); 
console.log(incrementString('foof099', true)); 
console.log(incrementString('foof100', true)); 
console.log(incrementString('foof60', true)); 
 
console.log(incrementString('foo00000001')); 
console.log(incrementString('foo0009999')); 
console.log(incrementString('foo999999'));

Answer 2

На мой взгляд вы слишком усложнили себе задачу. Ваше решение больше похоже на учебное упражнение. Тело функции может быть в одну строку:

function incrementString(str) {
  return str.replace(/\d*$/, s => ('' + (+s + 1)).padStart(s.length, '0'));
}

function incrementString(str) { 
  return str.replace(/\d*$/, //находим все цифры в конце строки и заменяем 
    s => ( 
      '' + (+s + 1) //на найденные цифры, преобразовыванные в число + 1 
    ).padStart(s.length, '0') //дополненные нулями 
  ); 
} 
 
console.log(incrementString('foo')); 
console.log(incrementString('foo000')); 
console.log(incrementString('foo001')); 
console.log(incrementString('foo077')); 
console.log(incrementString('foo089')); 
console.log(incrementString('foo099')); 
console.log(incrementString('foof099')); 
console.log(incrementString('foof100')); 
console.log(incrementString('foof999'));

Answer 3

вариант ...

function incrementString(d) { 
  return d.replace(/(0*)(\d*$)/, function(b, a, c) { 
    return (a + ++c).slice(a ? -b.length : 0); 
  }); 
} 
 
console.log(incrementString('foo')); 
console.log(incrementString('foo000')); 
console.log(incrementString('foo001')); 
console.log(incrementString('foo9')); 
console.log(incrementString('foo099')); 
console.log(incrementString('foo999'));

READ ALSO
Как отловить ошибку правильно?

Как отловить ошибку правильно?

Пытаюсь делать отлов ошибок следующим образом:

243
Как вернуть из async объект

Как вернуть из async объект

У меня есть async функция loadКак мне из неё вернуть объект?

199
RegExp replace (node.js) не работает корректно

RegExp replace (node.js) не работает корректно

Здравствуйте, функция в Javascript RegExp (nodejs) не работает корректно, мне нужно получить число с запятой, вот данные: 299,00 р

259
Как удалить лишние переносы строк в CK Editor + Django?

Как удалить лишние переносы строк в CK Editor + Django?

Есть текстовое поле на котором 'висит' CK EditorВсе отлично, но ничего не мешает добавлять неограниченное число переносов строки:

270