public IDictionary <ICurrencyDenomination, int> GetChange(PurchaseTransaction transaction, IEnumerable <ICurrencyDenomination> denominationsAvailable) { decimal amountChangeDue = transaction.AmountReceived - transaction.AmountOwed; var changeCalculator = GetCalculator(transaction.AmountOwed); return(changeCalculator.GetChange(amountChangeDue, denominationsAvailable)); }
public IEnumerable <PurchaseTransaction> GetPurchaseTransactions() { List <PurchaseTransaction> purchaseTransactions = new List <PurchaseTransaction>(); using (StreamReader fileStreamReader = File.OpenText(_filePath)) { int fileLineNumber = 1; string transactionLine; while ((transactionLine = fileStreamReader.ReadLine()) != null) { // Assume any blank line is the end of the file, so that we can skip any remaining new lines at the end of the file. if (String.IsNullOrWhiteSpace(transactionLine)) { break; } string[] transactionAmounts = transactionLine.Split(','); // Check for an incorrect number of parameters for our expected input if (transactionAmounts.Length != 2) { throw new Exception(String.Format(UNEXPECTED_INPUT, transactionLine, fileLineNumber, _filePath)); } PurchaseTransaction transaction = new PurchaseTransaction(); decimal amountOwed; decimal amountReceived; bool amountOwedParseSuccess = Decimal.TryParse(transactionAmounts[0], out amountOwed); bool amountReceivedParseSuccess = Decimal.TryParse(transactionAmounts[1], out amountReceived); // Check that the values received are decimal values if (!amountOwedParseSuccess || !amountReceivedParseSuccess) { throw new Exception(String.Format(UNEXPECTED_INPUT, transactionLine, fileLineNumber, _filePath)); } transaction.AmountOwed = amountOwed; transaction.AmountReceived = amountReceived; purchaseTransactions.Add(transaction); fileLineNumber++; } } return(purchaseTransactions); }
public string CalculateChange(PurchaseTransaction transaction) { string output; if (transaction.AmountReceived < 0) { output = NEGATIVE_RECEIVED_AMOUNT; } else if (transaction.AmountReceived > transaction.AmountOwed) { IDictionary <ICurrencyDenomination, int> denominationsDue = _changeCalculationStrategy.GetChange(transaction, DenominationsInRegister); StringBuilder denominationAmountsStringBuilder = new StringBuilder(); foreach (KeyValuePair <ICurrencyDenomination, int> denomination in denominationsDue) { int numberOfTheDenomination = denomination.Value; string denominationName; if (denomination.Key is UsCurrencyDenomination) { UsCurrencyDenomination usCurrencyDenomination = (UsCurrencyDenomination)denomination.Key; denominationName = numberOfTheDenomination > 1 ? usCurrencyDenomination.PluralizedName : usCurrencyDenomination.Name; } else { denominationName = denomination.Key.Name; } denominationAmountsStringBuilder.Append(numberOfTheDenomination + " " + denominationName + ", "); } // Remove trailing comma output = denominationAmountsStringBuilder.Remove(denominationAmountsStringBuilder.Length - 2, 2).ToString(); } else if (transaction.AmountReceived == transaction.AmountOwed) { output = NO_CHANGE_REQUIRED_MESSAGE; } else { decimal amountStillDue = transaction.AmountOwed - transaction.AmountReceived; output = String.Format(INSUFFICIENT_FUNDS_RECEIVED, amountStillDue.ToString("C", NumberFormatInfo.CurrentInfo)); } return(output); }
public IDictionary <ICurrencyDenomination, int> GetChange(PurchaseTransaction transaction, IEnumerable <ICurrencyDenomination> denominationsAvailable) { var changeCalculator = new LargestDenominationFirstChangeCalculator(); return(changeCalculator.GetChange(transaction.AmountReceived - transaction.AmountOwed, denominationsAvailable)); }
private static void OutputChange(CashRegister cashRegister, PurchaseTransaction transaction) { Console.WriteLine(cashRegister.CalculateChange(transaction)); }