Преобразовать и проверить строку, представляющую номера страниц

javascript

56 просмотра

2 ответа

2577 Репутация автора

Мне нужно проверить, если строка - которая представляет номер страницы - является допустимым; в противном случае строка должна быть адаптирована, если это возможно.

Действительный номер страницы может быть 12или 33-40.

Поэтому прежде всего я убираю пробелы, чтобы сделать их 33 - 40действительными. Также я заменяю специальные черточки.

value = value.replace(/\u2013|\u2014/g, '-').replace(/\s+/g, '');

Что-то особенное в том, что входные данные могут быть в формате 530-5, который следует преобразовать в 530-535. 530-41должен получить 530-541. Я не знаю, как это сделать.

Далее я бы сделал тест, если есть только цифры или тире. Может быть, это не лучший способ ?!

value = /^[0-9\-]*$/.test(value) ? value : undefined;

Примеры

342         // valid
0           // invalid
12-15       // valid
12-5        // gets 12-15
15-12       // invalid
115-20      // gets 115-120
115 -  20   // gets 115-120
-20         // invalid
Автор: user3142695 Источник Размещён: 18.07.2016 11:55

Ответы (2)


2 плюса

19476 Репутация автора

Что-то особенное, что ввод может быть в формате 530-5, который должен быть преобразован в 530-535. 530-41 должен получить 530-541. Я не знаю, как это сделать.

Следующая функция должна работать для решения этой проблемы:

Plnkr

<script>
    function getValidRange(pgNo) {
        var pgNoS = pgNo.split('-');

        var len1 = pgNoS[0].toString().length;
        var len2 = pgNoS[1].toString().length;
        var multiplier = 1;

        var newPage = "";

        if (Number(len1) > Number(len2)) {
            for (var i = 0; i < len1 - len2; i++) {
                newPage = newPage + pgNoS[0].toString()[i] + "";
            }
            multiplier = Math.pow(10, pgNoS[1].toString().length);
            pgNoS[1] = newPage + pgNoS[1];
        }
        if (Number(pgNoS[1]) < Number(pgNoS[0])) {
            pgNoS[1] = Number(pgNoS[1]) + multiplier;
        }
        return pgNoS[0].toString() + '-' + pgNoS[1].toString();
    }

    document.write(getValidRange('12-5') + "<br>");
    document.write(getValidRange('530-41') + "<br>");
    document.write(getValidRange('530-28') + "<br>");
    document.write(getValidRange('536-5') + "<br>");
    document.write(getValidRange('5312328-5') + "<br>");
    document.write(getValidRange('5312328-345') + "<br>");
    document.write(getValidRange('5312328-1211') + "<br>");
</script>

Выход

12-15
530-541
530-628
536-545
5312328-5312335
5312328-5312345
5312328-5321211

PS: код не тестируется для крайних случаев. Не стесняйтесь указывать на любые ошибки / ошибки, и я исправлю их для вас.

Автор: Raman Sahasi Размещён: 18.07.2016 12:31

1 плюс

42843 Репутация автора

Решение
// create function to return normalised pagination
function getPages(i){
    // match pattern to extract pages from valid strigs
    // http://regexper.com/#/^\s*(\d+)\s*(?:(?:\u2013|\u2014|-)\s*(\d+)\s*)?$/
    var m = i.match(/^\s*(\d+)\s*(?:(?:\u2013|\u2014|-)\s*(\d+)\s*)?$/);
    // if there is a match then validate, else return null immediately
    if(m !== null && parseInt(m[1])) {
        // get references to first and second page numbers
        var from = parseInt(m[1]),
            to = parseInt(m[2]);
        // if there is a from and to page and to is greater than from...
        if(to && to > from) return from + '-' + to;
        // if there is from and to page and to is order of magnitude less than from
        else if(to && m[2].length < m[1].length) return from + '-' + (m[1].substr(0, m[1].length - m[2].length) + to);
        // if there is only from
        else if(!to) return from + '';
        // finally, if nothing else matched, return null
        else return null
    } else {
        return null;
    }
}

['342', '0', '12-15', '12-5', '15-12', '115-20', '115 -  20', '-20'].forEach(i => console.log(getPages(i)))

Объяснение регулярного выражения ... введите описание изображения здесь

Автор: Billy Moon Размещён: 18.07.2016 12:35
Вопросы из категории :
32x32