После 2 символов разделить оставшиеся символы на группы по 4 символа? - PullRequest
1 голос
/ 23 октября 2019

Как можно получить число от 99123412341234 до 99-1234-1234-1234?

  • Первые два символа в группе (99).
  • Остальные разделеныв группы по 4 символа (1234, 1234, 1234).
  • Группы объединяются с -.

Моя версия Франкенштейна работает (см. ниже), но тамдолжно быть более элегантным решением.

let myNumber = 99123412341234;  

let parsedNumber = [
    myNumber.slice(0,2), 
    myNumber.slice(2, scannedTicket.ticketId.length).match(/.{1,4}/g).join("-")
].join("-");

// Result: parsedNumber = "99-1234-1234-1234"

Ответы [ 5 ]

2 голосов
/ 23 октября 2019

Обновление:

Согласно комментариям, Lookbehind может поддерживаться не всеми браузерами, поэтому вот версия, которая не использует Lookbehinds:

const input = `99123412341234`;
const regex = /(?=(?:\d{4})+$)/gm;
const subst = `-`;

if (/^\d\d(?:\d{4})+$/.test(input))
{
    const result = input.replace(regex, subst);
    console.log(result);
}

Используются два шаблона;один, чтобы проверить правильность формата входной строки: ^\d\d(?:\d{4})+$. А другой для сопоставления и замены позиций разделения: (?=(?:\d{4})+$).


Исходный ответ:

Вы можете использовать следующую схему:

(?<=^\d\d(?:\d{4})*)(?!$)

И заменить на -.

Демо .

Разбивка:

(?<=            # Start of a positive Lookbehind.
    ^           # Beginning of the string.
    \d\d        # Matches exactly two digits.
    (?:         # Start of a non-capturing group.
        \d{4}   # Matches exactly four digits.
    )           # End of the non-capturing group.
    *           # Repeat the previuos group between zero and unlimited times.
)               # End of the Lookbehind.
(?!$)           # Negative Lookahead to prevent matching the position at the end.

Пример JavaScript:

const input = `99123412341234`;
const regex = /(?<=^\d\d(?:\d{4})*)(?!$)/gm;
const subst = `-`;

const result = input.replace(regex, subst);
console.log(result);
1 голос
/ 23 октября 2019

/(\d){4}/g регулярное выражение здесь будет соответствовать любой цифре (\d) в группах по 4 ({4}), для всей строки (/g)

function formatNumber (input) {
  let a = input.slice(0, 2);
  let b = input.slice(2).match(/(\d){4}/g).join('-')
  
  return `${a}-${b}`
}

console.log(formatNumber("99381938999314"))
1 голос
/ 23 октября 2019

Вы можете сделать это без цикла for, сократив каждый символ на подмассив и затем соединив результаты.

console.log(formatNumber(99123412341234, '-', 4, 2));

/**
 * Formats 
 * @param {int}    n - a number
 * @param {String} d - delimiter
 * @param {int}    p - partition size
 * @param {int}    o - initial offset
 */
function formatNumber(n, d, p, o) {
  return n.toString(10).split('').reduce((a, c, i) => {
    if (i % p === o) a.push([c]);
    else a[a.length - 1].push(c);
    return a;
  }, [[]]).map(e => e.join('')).join(d);
}
.as-console-wrapper { top: 0; max-height: 100% !important; }

Конечно, если вам нужна версия с регулярным выражением, вы можете попробовать это ...

console.log(formatNumber(99123412341234, '-'));

function formatNumber(n, d) {
  return n.toString(10).match(/^(\d{2})(\d{4})(\d{4})(\d{4})$/).slice(1).join(d);
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
0 голосов
/ 23 октября 2019
>  num = `35410009667444306`
'35410009667444306'
> `${num.substr(0, 2)}-${num.slice(2).match(/.{1,4}/g).join(`-`)}`
'35-4100-0966-7444-306'
0 голосов
/ 23 октября 2019

Один из подходов заключается в использовании slice () .

let number = 99123412341234;
number = number.toString(); // Convert number to string.

let parsedNumber = number.slice(0, 2); // Get first two characters.
let length = number.slice(2).length;

for (let i = 2; i < length; i += 4) {
  parsedNumber += "-" + number.slice(i, i + 4);
}

console.log(parsedNumber);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...