Этот вопрос представляет собой сочетание практики регулярных выражений и практики модульного тестирования.
Regex part
Я создал эту проблему separateThousands
для личной практики:
Задав число в виде строки, введите запятые для разделения тысяч. Число может содержать необязательный знак минуса и необязательную десятичную часть. Не будет лишних начальных нулей.
Вот мое решение:
String separateThousands(String s) {
return s.replaceAll(
String.format("(?:%s)|(?:%s)",
"(?<=\\G\\d{3})(?=\\d)",
"(?<=^-?\\d{1,3})(?=(?:\\d{3})+(?!\\d))"
),
","
);
}
Способ работы состоит в том, что он классифицирует запятые двух типов: first и rest . В приведенном выше регулярном выражении подшаблон rest фактически появляется перед first . Совпадение всегда будет нулевой длины, которое будет replaceAll
с ","
.
rest в основном оглядывается назад, чтобы увидеть, было ли совпадение, за которым следуют 3 цифры, и смотрит вперед, чтобы увидеть, есть ли цифра. Это какой-то механизм цепной реакции, запущенный предыдущим матчем.
first , в основном, смотрит за якорем ^
, за которым следует необязательный знак минуса и от 1 до 3 цифр. Остальная часть строки с этой точки должна соответствовать тройкам цифр, за которыми следует нецифровка (которая может быть $
или \.
).
Мой вопрос к этой части:
- Можно ли упростить это регулярное выражение?
- Можно ли его оптимизировать дальше?
- Заказ отдых до первый является преднамеренным, поскольку первый требуется только один раз
- Нет группы захвата
Часть модульного тестирования
Как я уже говорил, я автор этой проблемы, поэтому я также отвечаю за разработку тестовых примеров для них. Вот они:
INPUT, OUTPUT
"1000", "1,000"
"-12345", "-12,345"
"-1234567890.1234567890", "-1,234,567,890.1234567890"
"123.456", "123.456"
".666666", ".666666"
"0", "0"
"123456789", "123,456,789"
"1234.5678", "1,234.5678"
"-55555.55555", "-55,555.55555"
"0.123456789", "0.123456789"
"123456.789", "123,456.789"
У меня не было большого опыта в тестировании промышленных модулей, поэтому мне интересно, могут ли другие прокомментировать, является ли это хорошим освещением, пропустил ли я что-нибудь важное и т. Д. (Я всегда могу добавить больше тестов, если есть сценарий, который я пропустил).