Запятая, которую вы используете в printf
, не простой символ, это часть шаблона %,d
.
- Если задан флаг
','
('\u002c'
), то вставляется разделитель группировки, зависящий от локали, путем сканирования целой части строки от наименее значимых до наиболее значимых цифр и вставки разделителя через определенные интервалыпо размеру группировки локали.
Вам необходимо переместить его из шаблона %d
и добавить условие для удаления запятой для первого соответствующего номера.
for (int i = 0; x <= y; x++) {
if (x % 5 == 0) {
System.out.printf("%s%d", (i++ == 0 ? "" : ","), x);
}
}
Или вы можете написать это необычно
String result = IntStream.rangeClosed(x, y)
.filter(i -> i % 5 == 0)
.mapToObj(Integer::toString)
.collect(Collectors.joining(","));
System.out.println(result);
Я показал два рабочих примера, которые используют ","
в качестве единственного разделителя.Это становится немного сложнее для трех разделителей (","
и ", and"
и " and "
).Это редкий случай, когда пригодится оператор switch
.
final List<String> values = IntStream.rangeClosed(x, y)
.filter(i -> i % 5 == 0)
.mapToObj(Integer::toString)
.collect(Collectors.toList());
switch (values.size()) {
case 0:
System.out.println("NONE");
break;
case 1:
System.out.println(values.get(0));
break;
case 2:
System.out.println(String.join(" and ", values));
break;
default:
final String last = values.remove(values.size() - 1);
System.out.println(String.join(", ", values) + ", and " + last);
}