Примените регулярное выражение, только если за ним следует персонаж - PullRequest
0 голосов
/ 03 сентября 2018

На моем сайте я имею дело с различными числами (целые и с плавающей точкой). Вот некоторые примеры: .2060 0.2060 100.2060 1000 10000.00.

Я хотел вставить тысячные запятые при отображении их для большей читабельности, поэтому я использую это RegEx решение .

Однако я столкнулся с проблемой, поскольку она преобразует числа типа 0.2060 в 0.2,060, поэтому мне нужно выяснить, как применять RegEx только к символам, предшествующим символу ..

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

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

Первая попытка состоит в том, чтобы попытаться сопоставить \d?\d?(\d\d\d)*(\.\d*\|\b) (одна или две цифры, за которыми следуют ноль или более групп из трех цифр - это то, что нас интересует), а затем либо десятичная точка с большим количеством цифр ( нас это не интересует, так как мы не собираемся заменять какой-либо из них) или границу слова (чтобы запретить сопоставление последовательностей с несколькими точками, например (например, 012345.2342.1233)

Проблема в том, что у нас есть только одна группа интересов здесь (центральная (\d\d\d)), но это означает, что мы должны построить шаблон замещения со всеми остальными и поместить группу куда-нибудь (таким образом, наша регулярное выражение изменяется на (\d?\d?)(\d\d\d)*(\.\d\|\b), поэтому мы можем использовать \1,\2\3 в качестве замены). Это неверно, потому что мы будем ставить только запятую перед последней группой, совпадающей с \2, и мы должны сделать замену для каждой подходящей группы.

Следующий подход заключается в явном использовании нескольких групп в регулярном выражении, например (\d?\d?)(\d\d\d)?(\d\d\d)?...(\d\d\d)?(\.\d*\|\b), поэтому мы можем заменить каждую группу (\2, \3 ... на ,\2, ,\3 ...) но это также не работает, так как вы всегда ставите запятые на свои места, независимо от соответствия внутренних групп (что дает вам что-то вроде 1,,,,000,000,000.234566. Конечно, вы можете сделать двухэтапный подход, сделав два замены: последняя и та, которая заменяет ,,+ на , (несколько последовательностей запятых в одну запятую)

Единственный подход заключается в том, чтобы фактически сопоставить \d\d\d и заменить совпадение на ,\0. Но на этот раз мы снова столкнемся с проблемами, поскольку у нас должна быть вся цепочка цифр, поскольку группы начинаются в конце, и это контекстная информация, которую мы должны выделить из нашего регулярного выражения.

Единственное решение, которое работает, состоит в том, чтобы идентифицировать строку, которая соответствует интересующей последовательности цифр (строки цифр, которым не предшествует точка и которые содержат более трех цифр, например, (^\|[^.\n])(\d\d\d\d*), и затем выполнить всю подстановку над ними. что вам нужно начать справа и идти налево, вы должны сделать это один раз (ищите последнюю группу из трех цифр \d\d\d$ и измените ее на ,\0)

Как было предложено в одном из ответов на вопрос, на который вы ссылаетесь в своем, лучший способ - использовать альтернативный метод, такой как this (используя toLocaleString() метод javascript)

0 голосов
/ 03 сентября 2018

Вы можете просто проверить, содержит ли номер . или нет, и на основе этого формата номер.

Вот пример кода, который я пробовал:

const numbers = [
  "0.2060",
  "0.2060",
  "2500",
  "2500000",
  "100.0250",
  "5000.1056"
]

const numberWithCommas = (x) => {
  return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

const formatted = numbers.map(aNumber => {
  const split = aNumber.split(".");
  split[0] = numberWithCommas(split[0]);
  return split.join('.');

});

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