【问题标题】:Overloaded Methods with User Input (ReadLine())具有用户输入的重载方法 (ReadLine())
【发布时间】:2019-07-21 16:48:33
【问题描述】:

我自己正在学习 C#(不是家庭作业),并且在有用户输入时对方法重载感到困惑。

我正在做一个练习,允许用户输入一个项目的出价金额。我需要包含 3 个重载方法(int、double、string)。 (练习说使用双精度而不是十进制。)

我知道如何编写重载方法,我的困惑来自于用户输入。如果我接受输入(ReadLine)作为字符串,它选择字符串方法,如果我接受输入作为 int,则调用 int 方法。我该如何处理?我使用 tryParse 吗?如何使用 3 种可能的输入法(int、double、string)来做到这一点?

另外,为了增加一个令人沮丧的转折,要接受的字符串必须是数字,并且前面有“$”符号或数字后跟“美元”。我希望我在下面的代码中正确地完成了这一点。不知道如何按字符串修剪,所以我不得不按字符来做...

希望有一个基本/简单的解释,因为我还没有学到任何太花哨的东西。

谢谢!

namespace Auction
{
class Program
{
    static void Main(string[] args)
    { 
        string entryString;
        //int entryInt;  // do I need this?
        //int entryDouble;  // do I need this?
        double bidNum;

        const double MIN = 10.00;
        Console.WriteLine("\t** WELCOME TO THE AUCTION! **\n");

        Console.Write("Please enter a bid for the item:  ");
        entryString = Console.ReadLine().ToLower();
        double.TryParse(entryString, out bidNum);  // this turns it into a double...

        BidMethod(bidNum, MIN);
        Console.ReadLine();
    }

    private static void BidMethod(int bid, double MIN)
    {  // OVERLOADED - ACCEPTS BID AS AN INT
        Console.WriteLine("Bid is an int.");
        Console.WriteLine("Your bid is: {0:C}", bid);
        if (bid >= MIN)
            Console.WriteLine("Your bid is over the minimum {0} bid amount.", MIN);
        else
            Console.WriteLine("Your bid is not over the minimum {0} bid amount.", MIN);
    }

    private static void BidMethod(double bid, double MIN)
    {  // OVERLOADED - ACCEPTS BID AS A DOUBLE

        Console.WriteLine("Bid is a double.");
        Console.WriteLine("Your bid is: {0:C}", bid);
        if (bid >= MIN)
            Console.WriteLine("Your bid is over the minimum {0} bid amount.", MIN);
        else
            Console.WriteLine("Your bid is not over the minimum {0} bid amount.", MIN);
    }

    private static void BidMethod(string bid, double MIN)
    {  // OVERLOADED - ACCEPTS BID AS A STRING

        string amount;
        int amountInt;

        if (bid.StartsWith("$")) 
            amount = (bid as string).Trim('$');  // Remove the $
        if (bid.EndsWith("dollar"))
            amount = bid.TrimEnd(' ', 'd', 'o', 'l', 'l', 'a', 'r', 's');
        else
            amount = bid;

        Int32.TryParse(amount, out amountInt);  // Convert to Int
        Console.WriteLine("Bid is a string.");

        Console.WriteLine("Your bid is: {0:C}", bid);
        if (amountInt >= MIN)
            Console.WriteLine("Your bid is over the minimum {0} bid amount.", MIN);
        else
            Console.WriteLine("Your bid is not over the minimum {0} bid amount.", MIN);
    }
}

}

【问题讨论】:

  • 请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。
  • 谢谢,新来的网站...

标签: c# user-input overloading


【解决方案1】:

假设您希望支持各种输入美元金额的方式,那么我建议您使用 TryParse 的想法可行:

  • 首先使用int.TryParse - 因为int 是最严格的(不是 允许小数点等)
  • 二次使用double.TryParse
  • 最后,如果这些都不起作用,请保留为字符串。

【讨论】:

  • double 的格式也可能会导致问题,因为他说它周围有字符。作为旁注,货币应存储为decimal,而不是double
  • 据我所知,这部分是在字符串重载中处理的。同意现实世界中的小数示例
  • 我需要使用 if 语句吗?它只是不停地调用所有的方法,或者说它是一个双精度的 int - 我只想根据用户的输入调用一个方法......请帮忙,对这个超级沮丧......
【解决方案2】:

我认为将intdouble 版本替换为decimal 版本会更合适,因为decimal 更便于存储货币值(更多详情请搜索SO)。

所以,读取输入,搜索美元符号,如果没有,使用decimal.TryParse()decimal 重载,否则使用string 重载。

由于处理一个数字是否包含美元符号没有区别,我会做以下事情。

...
string entryString = Console.ReadLine();
BidMethod(entryString, 10.00m); // m stands for decimal, d for double
...

private static void BidMethod(string bid, decimal min)
{   
    decimal number;
    if (decimal.TryParse(bid.Replace("$", ""), out number))
    {
        Console.WriteLine("Your bid is: {0:C}", bid);
        if (number >= min)
            Console.WriteLine("Your bid is over the minimum {0} bid amount.", min);
        else
            Console.WriteLine("Your bid is not over the minimum {0} bid amount.", min);   
    }
}

【讨论】:

  • 在那种情况下,我不会做那个练习,因为它教会了你使用双倍赚钱的坏习惯。在值实际上很重要的地方执行此操作,您将拼命寻找 1+1 不是 2 的问题在哪里(尽管值不同)。
【解决方案3】:

根据我的理解和您的 cmets: 因此,您只需要(或练习请求)接受intdoublestring

我认为您需要先检查输入值是否包含$,如果是,则可以调用字符串函数。

然后您将使用Int32.TryParse 检查值是否为int,如果成功则调用 int 函数

最后一步是使用Double.TryParse检查double的值

Double 的长度远大于int,这就是为什么你应该先检查int

【讨论】:

    【解决方案4】:
    using System;
    using static System.Console;
    namespace Auction
    {
        class Program
        {
            static void Main(string[] args)
            {
                string entryString;
                decimal bidNum;
                const decimal MIN = 10.00m;
    
                Console.Write("Please enter a bid for the item:  ");
                entryString = Console.ReadLine().ToLower();
                decimal.TryParse(entryString, out bidNum);  // this turns it into a double...
    
                BidMethod(bidNum, MIN);
                Console.ReadLine();
            }
    

    【讨论】:

    • 不鼓励仅使用代码的答案,原因是:呈现的代码如何回答我如何处理替代输入格式?
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多