Здравствуйте, такая задача: нужно написать функцию, которая будет выводить измененную строку, а именно если мы получаем строку '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
Чтобы было максимально легко разобраться, я постарался лишь модифицировать ваш пример:
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 параметра:
Хочу отметить, что тут имеется весьма забавный... ммм "артефакт".
Так как регулярное выражение тут требует доработки, переданная строка, например такая, тоже отработает и выведет нужный результат:
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'));
На мой взгляд вы слишком усложнили себе задачу. Ваше решение больше похоже на учебное упражнение. Тело функции может быть в одну строку:
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'));
вариант ...
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'));
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Здравствуйте, функция в Javascript RegExp (nodejs) не работает корректно, мне нужно получить число с запятой, вот данные: 299,00 р
Есть текстовое поле на котором 'висит' CK EditorВсе отлично, но ничего не мешает добавлять неограниченное число переносов строки: