Как увеличить строку в JavaScript, содержащую ведущие нули?

У меня есть строка вроде:

MPG_0023

Я хочу найти что-то вроде

MPG_0023 + 1

и я должен получить

MPG_0024

Как это сделать в JavaScript? Следует позаботиться о том, чтобы, если нет ведущих нулей или один ведущий ноль все равно должен работать, как MPG23 должен давать MPG24 или MPG023 должен давать MPG024.

Не должно быть предположения, что есть подчеркивание или ведущие нули, единственное, что первая часть - это любая строка или даже не строка, а числовая часть может иметь или не иметь ведущие нули, и это любой вид числа, поэтому он должен работать для 0023 (возврат 0024) или для gp031 (возврат gp032) и т. д.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 998
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы можете преобразовать в число, увеличить значение и вернуть обратно. Затем проверьте, нужны ли вам ведущие нули, посмотрев на длину строки.

Фрагмент ниже:

let str = "MPG_0023",
    num = Number(str.substr(4)) + 1,
    newStr = String(num);

function addLeading0(str) {
  return str.length === 2 ? '00' + str : (str.length === 3 ? '0' + str : str);
}

console.info("MPG_" + addLeading0(newStr));

Используя регулярное выражение, вы можете сделать это так.

var text1 = 'MPG_0023';
var text2 = 'MPG_23';

var regex = /(.*_[0]*)(\d*)/;

var match1 = regex.exec(text1);
var match2 = regex.exec(text2);

var newText1 = match1[1] + (Number(match1[2]) + 1);
var newText2 = match2[1] + (Number(match2[2]) + 1);

console.info(newText1);
console.info(newText2);

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

var n = 'MPG_0023';
var a = n.split('_');
var r = a[0]+'_'+(("0000"+(++a[1])).substr(-4));
console.info(r);

Или, если вы действительно хотите использовать регулярное выражение, подчеркивание не имеет значения.

var n = "MPG_0099";
var r = n.replace(/(\d+)/, (match)=>("0".repeat(4)+(++match)).substr(-4));
console.info(r);

Использование регулярного выражения вместе с функцией padStart

function add(str, n) {
  return str.replace(/(\d+)/, function(match) {
    var length = match.length;
    var newValue = Number(match) + n;

    return newValue.toString(10).padStart(length, "0");
  });
}

console.info(add("MPG_023", 101));
console.info(add("MPG_0023", 101));
console.info(add("MPG_0000023", 10001));
console.info(add("MPG_0100023", 10001));

MPG_0099 возвращает MPG_00100 .., вероятно, должен возвращать MPG_0100

I wrestled a bear once. 02.04.2018 16:47

да, я видел это, просто подумал, что это хороший ответ, и вы можете исправить его вместо того, чтобы просто добавить примечание о том, что ваше решение не работает. "MPG_0099".replace(/(\d+)/, (match)=>("0".repeat(4)+(++match)).substr(-4)); - это то, что я бы сделал, но поскольку вы полностью изменили свой ответ, я просто добавлю это к своему ответу.

I wrestled a bear once. 02.04.2018 16:58

@ Occam'sRazor, ты прав, потому что я обновил ответ!

Ele 02.04.2018 16:58

Инкремент и подушечка одинаковое значение (комментарии встроенные)

var prefix = "MPG_"
var padDigit = 4; //number of total characters after prefix
var value = "MPG_0023";

console.info("currentValue ", value);

//method for padding
var fnPad = (str, padDigit) => (Array(padDigit + 1).join("0") + str).slice(-padDigit);

//method to get next value
var fnGetNextCounterValue = (value) => {
   var num = value.substring(prefix.length); //extract num value
   ++num; //increment value
   return prefix + fnPad(num, padDigit); //prepend prefix after padding
};

console.info( "Next",  value = fnGetNextCounterValue(value) );
console.info( "Next",  value = fnGetNextCounterValue(value) );
console.info( "Next",  value = fnGetNextCounterValue(value) );

Один из способов - разделить строку на символ «_», увеличить число, а затем снова добавить нули к числу.

var testString = "MGP_0023";
var ary = testString.split("_");

var newNumber = Number(ary[1]) + 1;
var result = ary[0] + pad(newNumber);

// helper function to add zeros in front of the number
function pad(number) {
    var str = number.toString();
    while (str.length < 4) {
        str = '0' + str;
    }

    return str;
}
Ответ принят как подходящий

Вы можете использовать регулярные выражения для внесения изменений, как показано в следующем коде.

var text = "MPG_0023";
var getPart = text.replace ( /[^\d.]/g, '' ); // returns 0023
var num = parseInt(getPart); // returns 23
var newVal = num+1; // returns 24
var reg = new RegExp(num); // create dynamic regexp
var newstring = text.replace ( reg, newVal ); // returns MPG_0024

console.info(num);
console.info(newVal);
console.info(reg);
console.info(newstring);

Этот ответ идеален, другие ответы могут сломаться для некоторых строк, Спасибо, Синха!

ace 15.04.2018 19:43

Если вы начнете с «MPG_0099», вы получите «MPG_00100», поэтому я бы не сказал, что это правильно. У вас должно получиться "MPG_0100"

FrodmanG 18.06.2019 16:35

@FrodmanG, да, вы правы. Но это было требованием в исходном вопросе.

Sinha 21.06.2019 11:04

Другие вопросы по теме