【问题标题】:Can I force the console to keep both price and tiprate on the same line?我可以强制控制台将价格和小费保持在同一条线上吗?
【发布时间】:2017-04-18 11:30:50
【问题描述】:
import java.util.Scanner;
public class Tipping {

  public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    System.out.print("Please enter initial price followed by tip percentage: ");
    double Price = s.nextDouble(); double TipRate = s.nextDouble();
    double TipAmount;
    TipAmount = (Price*TipRate)/100;
    System.out.println("Tip amount: " + TipAmount);
    System.out.print("Total price: " + (TipAmount + Price) +".");
  }}

我总是在第一行得到价格,在另一行得到小费。

【问题讨论】:

  • 如果你想打印没有换行符的东西,不要使用 println。
  • 我没有用 println 的价格,仔细看看
  • 旁注:您想了解 Java 命名约定。变量名采用 camelCase;喜欢小费;不是小费!
  • 哦,那是件坏事吗?抱歉,我是新手,我今天才开始...
  • 哦,不要因为你不是故意做的事情而对自己生气,因为那对你不利。将其标记为积极的体验,让您继续前进 --->。

标签: java eclipse ide


【解决方案1】:

从您的措辞来看,您不喜欢通过扫描仪处理输入时,在第一个双精度值(价格)上按 Enter,它会前进到下一行并等待第二个双精度值(TipRate) .首先,字符“Enter”本质上是系统相关的换行符,所以当按下回车键时扫描器会立即拆分输入。具体来说,扫描器使用 Character.isWhiteSpace(char ch);函数来评估在哪里拆分令牌。

这完全取决于您希望如何处理您的输入。遗憾的是,如果不导入 Curses-esque 库并使用自定义命令提示符,则无法反转“\n”字符。您可以做的是写下您的输入并用空格分隔,例如写“23.4 12.3”会将输入写在同一行中,并将该行正确地分成您想要的 2 个标记。

如果纯粹出于审美原因,您可以将标记捕获为字符串,评估其中是否存在“\n”字符并要求用户在单行中重新输入变量,或者,如果“\n " 字符不存在,在 " " 字符上拆分字符串,然后使用 Double.valueOf(String str);功能。

注意不要使用 (Scanner in).setDelimiter(String str) 因为这将避免破坏“\n”字符上的标记(如果 str 字符串是例如“”)并且只会冻结你的程序直到用户使用空格字符拆分 2 个输入,然后抛出 InputMismatchException,因为 12.3\n12.3 32.3 将是“有效”输入,但无法将标记“12.3\n12.3”评估为单个 Double 变量。

【讨论】:

  • 空格键效果很好,谢谢@Alex Papageorgiou。
  • 你的想法是对的;我错过了;所以享受这个小小的支持吧;-)
【解决方案2】:

当然,避免调用:

System.out.println()

顾名思义(不知何故),它会打印一整条“线”;以换行符结束。

所以,要么多次调用 System.out.print();或更好的做法:一次调用 System.out.println(),但将所有您想要打印到该调用的字符串提供给该调用。

正如我刚刚看到您的评论:您正在调用 println() - 在您调用 print() 之前的行中!

鉴于您的评论:您必须了解该扫描仪的工作原理。扫描仪读取字符串;默认情况下,逐行。

换句话说:当您使用nextDouble() 时,扫描仪会假定您将输入一个代表数字的字符串 - 但您的输入会被用户按 ENTER 键“终止”。换句话说;那些换行符是不可避免的!

所以,只需像这样处理它们:

System.out.print("Please enter initial price: ");
double Price = s.nextDouble(); 
System.out.print("Please enter tip percentage: ");
double TipRate = s.nextDouble();

double TipAmount = (Price*TipRate)/100;
System.out.println("Tip amount: " + TipAmount + " results in Total price: " + (TipAmount + Price) +".");

长话短说:像这样使用控制台输入/输出时;您无法阻止某些换行符。接受这一点,不要太追求完美主义。

【讨论】:

  • 我说的是第 4 行,用户应该输入价格,然后是小费,小费总是跳到下一行
  • 我认为作为一名开发人员,我不能只满足于我不喜欢的东西,而是寻求如何改变它们。不幸的是,我不考虑过分追求完美主义。谢谢你的回答;)
  • 请仔细阅读:直接使用控制台,这样的事情很难。如果您的要求是“完美”的用户体验,您可能必须创建一个 GUI,或者,也许,使用一个为您提供 curses 功能的库。换句话说:完美是可能的,但它不是免费的!
  • 是的。你一直很有帮助。非常感谢你。我会开始调查你所说的那些诅咒。 :)
【解决方案3】:

System.out.print 代替System.out.println(代表打印行)。 System.out.println 将在输出流的给定字符串后打印一个换行符。

您也可以将打印与单个打印行结合起来。

例如你可以使用这个:

System.out.println(String.format("Tip amount: %f Total Price: %f", TipAmount, (TipAmount + Price)));

更新

扫描仪问题的简单解决方案是在一行中输入数字,并用空格分隔。

【讨论】:

  • 我没有用 println 的价格,仔细看看
  • 没有,但要提示,因此它将以换行符结束该行,然后打印总价。
  • 使用System.out.print("Tip amount: " + TipAmount); System.out.println("Total price: " + (TipAmount + Price) +".");
  • 我说的是第 4 行,用户应该输入价格后跟小费,小费总是跳到下一行
  • 那么为什么这不是您问题的一部分?!
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多