首页 > 解决方案 > 如果变量结果超过两个并在结果末尾显示“和”,如何显示逗号?

问题描述

由用户 (x,y) 给出给定数字中 5 的倍数的代码。如果没有要显示的,打印“NONE”。如果有两个要显示,用“and”分隔。如果有两个或更多要显示,用逗号分隔,最后用“and”分隔。

System.out.print("Enter first number: ");
int x = new Scanner (System.in).nextInt();
System.out.print("Enter last number: ");
int y = new Scanner (System.in).nextInt();
System.out.print("The multiples of 5 from "+x+ " to " +y+ " : ");

for (;x<=y; x++) {  
    if(x%5==0) {
            System.out.printf("%,d ",x);
    }
}

样本输出:

Enter number: 1
Enter number: 4
The multiples of 5 from 1 to 4: NONE

样本输出:

Enter number: 8
Enter number: 12
The multiples of 5 from 8 to 12: 10

样本输出:

Enter number: 1
Enter number: 17
The multiples of 5 from 1 to 17: 5, 10, and 15.

标签: javastringdelimitercsv

解决方案


你使用的逗号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", 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);
}

推荐阅读