Замените 0 на число, дополненное 0

Я работаю над проектом, который будет отслеживать файлы с автоматически сгенерированным номером. Однако мне нужно, чтобы пользователь мог указать формат этого числа. Например, если у меня есть строка формата file-000000#-v000a, первая часть числа всегда должна иметь длину не менее 6 цифр, а вторая должна иметь длину не менее 3 цифр, дополненную слева нулями, например: file-000128-001, но если у них больше или меньше 0, его следует соответствующим образом отрегулировать.

Я пытался придумать что-нибудь, используя функцию String.prototype.replace(), но не знаю, как вычислить leftPadding, чтобы это было правильное количество нулей.

Вот что я пробовал до сих пор:

let file_counter = 128;
let version_counter = 1;

// not sure how to calculate these numbers
let leftPadding = 6;
let leftPadding2 = 3;

const format = 'file-000000#-v000a';
const number = format
                .replace(/0+#/, file_counter.toString().padStart(leftPadding, '0'))
                .replace(/0+a/, version_counter.toString().padStart(leftPadding2, '0'));

console.info(number);

Формат действительно не имеет смысла. Можете ли вы найти другой способ выразить это, например. просто "000000"?

code 31.05.2024 19:39

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

Borisonekenobi 31.05.2024 20:07
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

С тех пор я нашел ответ на этот вопрос, так что если кто-то ищет что-то подобное, вот он:

const format = 'file-000000#-v000a';
const val1 = `${128}`;
const val2 = `${1}`;

let number = replaceValue(format, /0*#/g, val1);
number = replaceValue(number, /0*a/g, val2);

console.info(number);

function replaceValue(format, regex, value) {
    const matches = [];
    let m;
    do {
        m = regex.exec(format)
        if (m)
            matches.push({
                str: m[0],
                index: m.index
            })
    } while (m);

    for (let match of matches) {
        format = format.replace(match.str, value.padStart(match.str.length - 1, '0'));
    }

    return format;
}

Небольшое объяснение: В функции replaceValue() я нахожу все места, где встречается regex, а затем просматриваю каждое из них и заменяю его предоставленным значением.

Это мое решение:

const format = "file-000000#-v000a",
  val1 = `${128}`,
  val2 = `${1}`;

const helper = (str, val, len) => str.replace(/0+/, val.padStart(len, "0"));

var parts = format.split("-");

parts[1] = helper(parts[1], val1, 6);

parts[2] = helper(parts[2], val2, 3);

var whole = parts.join("-");

console.info(whole);

Это хорошая идея, но я не могу полагаться на - при разделении и объединении. Поскольку пользователь может указать любую строку формата, которую он хочет, она не всегда может содержать -, разделяющие разные части.

Borisonekenobi 04.06.2024 20:30

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

AbsoluteBeginner 04.06.2024 20:53

А как быть в случае, когда символа разбиения нет? Если я разделю по каждому символу, то в итоге у меня будет фиксированная длина 0 с перед числами.

Borisonekenobi 04.06.2024 23:19

В этом случае (я предполагаю, что вы имеете в виду, например, «file000000#v000a») вам не нужно разбивать по каждому символу: просто используйте match с регулярным выражением. Но это то, что вы можете сделать, даже если формат содержит символ разделения. regex101.com

AbsoluteBeginner 05.06.2024 08:32

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