Добавить разделитель тысяч в строку чисел
Мы знаем, что есть относительно лаконичный способ добавить к числу разделитель тысяч:
const numberWithCommas = (x) => {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
Как он работает? Для чего используется строка вещей в этом правиле?
метасимвол \B
Давайте сначала разберем основную структуру этого выражения:/\B(?=)/
, в этом выражении, кроме\B
Другая часть не принадлежитрезультат матча, то есть во всем выражении фактическое участие в финальном матче заменено на,
Тот, что впереди\B
.
Если вы раньше не общались\B
или\b
Тогда вы можете быть сбиты с толку, почему вы можете использовать эту замену, чтобы добавить запятую в строку чисел?Разве заменить не смысл замены, что вы заменили? Давайте сначала посмотрим на это\B
Что представляют собой метасимволы.
Возможно, нам нужно знать сначала\B
противоположно\b
Что он представляет:\b
представляет собойГраницы слов. Здесь можно объяснить сначала, что он соответствует позиции, так как^
а также$
Представляет начало и конец строки одинаково. Какова граница персонажа? Есть три положения, которые можно назвать границами слов:
- перед первым символом строки. если символ является словесным символом
- После последнего символа строки. если символ является словесным символом
- Между двумя символами в строке, если один из символов является символом слова, а другой нет.
Например\b
word\b
Позволяет сопоставить все слово, оно не будет совпадатьwword1такой шнур. Для упомянутого выше символа слова это относится к символам, которые могут образовывать слово, напримерw
. Противоположное верно для символов, не являющихся словами, таких как,
и пространства.
Если вы все еще не понимаете, вы можете обратиться кздесь(англ.) объяснение. вкратце,\b
Сопоставляется позиция, являющаяся границей слова. и наш\B
Наоборот, не принадлежит\b'
положение может быть\B
соответствовать. Как главный герой этой статьи, строка чисел123
, он соответствует1
а также2
,2
а также3
Позиции между, то есть замените эти позиции запятыми, и мы сможем добиться наших разделителей тысяч.
Предварительное утверждение (?=)
после того, как мы расстались/\B(?=)/
вторая часть(?=)
Роль такая, для простого примера:x(?=y)
, соответствует x, если за x следует y. как строкаxyz
X in будет совпадать, а y после него не будет совпадать. Это то, что называется предварительным утверждением. Если вы хотите узнать больше, пожалуйста, обратитесь кздесь.
Объединив эти два момента, мы знаем, что нам нужно найти позицию, и вещи, стоящие за этой позицией, должны соответствовать определенным условиям. Теперь можно предположить, какие условия нужно выполнить? Для известного разделителя тысяч, разумеется, запятая добавляется через каждые три цифры справа налево.
Таким образом, наше предварительное утверждение может сделать это первым, ища3положение кратных чисел, например:/\B(?=(\d{3})+)/
, новая часть(\d{3})+
,здесь+
Число соответствует содержимому в одной или нескольких скобках, то есть строке символов, состоящей из трех цифр. для строки символов12345
Например, это регулярное выражение соответствует1
а также2
,2
а также3
Эти две позиции, потому что за этими двумя позициями следуют числа, кратные 3 (234
а также345
).
Мы видим, что почти на пути к конечной цели. Нам просто нужно удалить некоторые необоснованные позиции, такие как выше1
а также2
положение между ними.
Утверждение строки позади (?!\d)
Утверждение просмотра вперед, упомянутое выше, гарантирует, что за каждой позицией следует число, кратное 3, но не гарантирует, что за ней следует число, кратное 3.ТолькоДалее следует число, кратное трем. как уже упоминалось12345
из1
а также2
Положение между , за исключением того, что за ним следует удовлетворяющее условие234
Кроме того, есть еще один5
, что не то, что мы ожидали. Утверждение lookbehind здесь, чтобы решить эту проблему.
понял(?=)
После этого для(?!)
Оно должно быть очень простым для понимания, то есть парой антонимов. Указывает, что соответствующий контент не может быть отслежен. такой как здесь(?!\d)
Указывает, что позади не может быть больше чисел, таких как приведенное выше.5
. Еще немного, добавим:(?=(\d{3})+(?!\d))
Это означает: за ним должно следовать число, кратное 3,а такжеПосле этого не может быть больше чисел (числа, кратные 3). он может быть десятичным.
или конец строки. Такие как12345.67
только в2
а также3
Положение между удовлетворяет нашим вышеуказанным условиям. Нам просто нужно указать место и заменить его запятой.
Глобальная замена /\B(?=(\d{3})+(?!\d))/g
string.replace(/\B(?=(\d{3})+(?!\d))/g, ",")
Замените все позиции, соответствующие условиям, разделителями тысяч, что решит эту проблему. Я не знаю, понимаете ли вы это? Если у вас есть какие-либо сомнения или что-то не так, пожалуйста, поправьте меня