C# 把投入的钱转换成硬币

C# 把投入的钱转换成硬币,c#,C#,我刚开始了一些关于c#的课程,并被分配了一个具有以下规则的作业: 提示用户输入美元和美分的金额。例如1.18 -显示四分之一硬币、一角硬币、五分镍币和一分硬币的数量以生成该数量 例如,如果输入2.16,则应显示: 8个25美分,1个10美分,1个5美分,1便士 我遇到的问题是,只有当他们键入货币价值作为一个整体时,这似乎才起作用。因此,如果他们想输入$1.18,他们会输入118,这样就可以了,但一旦他们输入1.18,它就崩溃了。另一个例子是,如果他们以7.65美元的价格键入765,它将正常工作,

我刚开始了一些关于c#的课程,并被分配了一个具有以下规则的作业: 提示用户输入美元和美分的金额。例如1.18 -显示四分之一硬币、一角硬币、五分镍币和一分硬币的数量以生成该数量

例如,如果输入2.16,则应显示: 8个25美分,1个10美分,1个5美分,1便士

我遇到的问题是,只有当他们键入货币价值作为一个整体时,这似乎才起作用。因此,如果他们想输入$1.18,他们会输入118,这样就可以了,但一旦他们输入1.18,它就崩溃了。另一个例子是,如果他们以7.65美元的价格键入765,它将正常工作,但是如果他们以7.65美元的价格正确键入,它将失败。对不起,我是个新来的,谢谢你的帮助

         int totalCash;
            Console.WriteLine("input money");
            string moneyString = Console.ReadLine();
            totalCash = int.Parse(moneyString);
            int quarter = totalCash / 25;
            totalCash %= 25;
            int dime = totalCash / 10;
            totalCash %= 10;
            int nickel = totalCash / 5;
            totalCash %= 5;
            int penny = totalCash / 1;
            totalCash %= 1;

            Console.WriteLine("{0} quarters, {1} dimes, {2} nickels, {3} pennies", quarter, dime, nickel, penny);
           ```



当你输入整数时,它就起作用了,这应该是你注意的线索。如果你假设整数是美元,你不能用整数来修改。你所有的除数都是100的一个因子,太大了。当您这样做时,您会注意到您的数据类型也是错误的。请注意,我不同意在调试时使用tryparse,因为它会吃掉错误。你应该在调试模式下运行它,然后你会得到一个实际的堆栈跟踪和它崩溃的一行。

有很多方法可以得到结果,但这是我尝试过的最好的方法:

public static string ConvertMoneyIntoCoins(double money)
    {
        int cents = (int)(Math.Round(money, 2) * 100);

        var coins = new[] {
                            new { Name = "Quarters", Value = 25 }, new { Name = "Dimes", Value = 10 },
                            new { Name = "Nickels", Value = 5 }, new { Name = "Pennies", Value = 1 } 
                         };

        var changes = coins.Select(coin => new { Amt = Math.DivRem(cents, coin.Value, out cents), Coin = coin }).Where(x => x.Amt != 0).ToList();

        var strBld = new StringBuilder();

        foreach (var change in changes)
        {
            strBld.Append(change.Amt + " " + change.Coin.Name + ", ");
        }

        return strBld.ToString();
    }

从始终使用
TryParse
版本开始。如果您想让用户输入十进制值,用户总会找到方法使您的完美程序崩溃。请改为使用
decimal.Parse
(或者甚至使用
decimal.TryParse
来处理非数字项),然后将其乘以100即可得到0分。如果他们输入2.657.it崩溃,你可能想舍入这个值——你能详细说明一下“it崩溃”是如何发生的吗?什么是异常消息?应用程序抛出异常的行是什么?如果没有这些信息,所有的答案都将是简单的猜测wrong@Fabio很明显,当您对像“2.16”这样的字符串执行
int.Parse
时,会出现什么问题。然而,OP通常应该习惯于添加异常信息。如果用户输入一个小数,它会响应“System.FormatException:输入字符串的格式不正确。作为注释会更好。这是您的意见,欢迎您使用,但我不同意在注释中解决问题。谢谢大家的帮助!看起来这里几乎每个人都告诉我如何修复它,我只需要搜索一些术语,让它变得有意义(字面上是我第二天的编码),我也没有意识到我可以在同一行代码中解析、转换和乘法。我在多条线上试过,我想我做得不对。再次感谢你的帮助,你真厉害!我不得不把它改高,因为它太整洁了。