I'm beginning to learn WPF and wanted to do a quick exercise. The code is as simple as it gets but I tried to evaluate each and every possible edge case. Any improvement is welcome, thanks.
C#:
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
namespace Calculator
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
double firstNumber, secondNumber, resultNumber = 0;
bool calcDone = false;
Operations operation = Operations.None;
string separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
public MainWindow()
{
InitializeComponent();
//Assign to the decimal button the separator from the current culture
dec.Content = separator;
}
//List the possible numeric operations
private enum Operations
{
None,
Division,
Multiplication,
Subtraction,
Sum
}
//Manage number buttons input
private void NumberButton_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
if (calcDone) //calculation already done
{
result.Content = $"{button.Content}";
calcDone = false;
}
else //calculation not yet done
{
if (result.Content.ToString() == "0")
{
result.Content = $"{button.Content}";
}
else
{
result.Content = $"{result.Content}{button.Content}";
}
}
}
//Manage operation buttons input
private void OperationButton_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
//Evaluate button pressed
switch (button.Content.ToString())
{
case "AC":
result.Content = "0";
break;
case "+/-":
if (!(result.Content.ToString() == "0"))
{
result.Content = Convert.ToDouble(result.Content) * -1;
}
break;
case "%":
if (!(result.Content.ToString() == "0"))
{
result.Content = Convert.ToDouble(result.Content) / 100;
}
break;
case "÷":
firstNumber = Convert.ToDouble(result.Content);
operation = Operations.Division;
result.Content = "0";
break;
case "×":
firstNumber = Convert.ToDouble(result.Content);
operation = Operations.Multiplication;
result.Content = "0";
break;
case "-":
firstNumber = Convert.ToDouble(result.Content);
operation = Operations.Subtraction;
result.Content = "0";
break;
case "+":
firstNumber = Convert.ToDouble(result.Content);
operation = Operations.Sum;
result.Content = "0";
break;
case "=":
switch (operation)
{
case Operations.Division:
if (calcDone)
{
if (!(result.Content.ToString() == "ERROR"))
{
result.Content = Convert.ToDouble(result.Content) / secondNumber;
}
}
else
{
//Check if division by 0
if (result.Content.ToString() == "0")
{
result.Content = "ERROR";
calcDone = true;
}
else
{
secondNumber = Convert.ToDouble(result.Content);
resultNumber = firstNumber / secondNumber;
result.Content = resultNumber;
calcDone = true;
}
}
break;
case Operations.Multiplication:
if (calcDone)
{
result.Content = Convert.ToDouble(result.Content) * secondNumber;
}
else
{
secondNumber = Convert.ToDouble(result.Content);
resultNumber = firstNumber * secondNumber;
result.Content = resultNumber;
calcDone = true;
}
break;
case Operations.Subtraction:
if (calcDone)
{
result.Content = Convert.ToDouble(result.Content) - secondNumber;
}
else
{
secondNumber = Convert.ToDouble(result.Content);
resultNumber = firstNumber - secondNumber;
result.Content = resultNumber;
calcDone = true;
}
break;
case Operations.Sum:
if (calcDone)
{
result.Content = Convert.ToDouble(result.Content) + secondNumber;
}
else
{
secondNumber = Convert.ToDouble(result.Content);
MessageBox.Show($"{firstNumber} + {secondNumber}");
resultNumber = firstNumber + secondNumber;
result.Content = resultNumber;
calcDone = true;
}
break;
}
break;
default:
if (!result.Content.ToString().Contains(separator))
{
result.Content = $"{result.Content}{button.Content}";
}
break;
}
}
}
}
XAML:
<Window x:Class="Calculator.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Calculator"
mc:Ignorable="d"
Title="MainWindow" Height="500" Width="300">
<Grid Margin="8">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1.5*"/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label x:Name="result" Content="0" Grid.ColumnSpan="4" HorizontalAlignment="Right"
VerticalAlignment="Bottom" FontSize="50"/>
<Button Content="AC" Margin="2" Grid.Column="0" Grid.Row="1"
FontWeight="bold" Click="OperationButton_Click"/>
<Button Content="+/-" Margin="2" Grid.Column="1" Grid.Row="1"
FontWeight="bold" Click="OperationButton_Click"/>
<Button Content="%" Margin="2" Grid.Column="2" Grid.Row="1"
FontWeight="bold" Click="OperationButton_Click"/>
<Button Content="÷" Margin="2" Grid.Column="3" Grid.Row="1"
FontWeight="bold" Click="OperationButton_Click"/>
<Button Content="7" Margin="2" Grid.Column="0" Grid.Row="2"
FontSize="20" Click="NumberButton_Click"/>
<Button Content="8" Margin="2" Grid.Column="1" Grid.Row="2"
FontSize="20" Click="NumberButton_Click"/>
<Button Content="9" Margin="2" Grid.Column="2" Grid.Row="2"
FontSize="20" Click="NumberButton_Click"/>
<Button Content="×" Margin="2" Grid.Column="3" Grid.Row="2"
FontWeight="bold" Click="OperationButton_Click"/>
<Button Content="4" Margin="2" Grid.Column="0" Grid.Row="3"
FontSize="20" Click="NumberButton_Click"/>
<Button Content="5" Margin="2" Grid.Column="1" Grid.Row="3"
FontSize="20" Click="NumberButton_Click"/>
<Button Content="6" Margin="2" Grid.Column="2" Grid.Row="3"
FontSize="20" Click="NumberButton_Click"/>
<Button Content="-" Margin="2" Grid.Column="3" Grid.Row="3"
FontWeight="bold" Click="OperationButton_Click"/>
<Button Content="1" Margin="2" Grid.Column="0" Grid.Row="4"
FontSize="20" Click="NumberButton_Click"/>
<Button Content="2" Margin="2" Grid.Column="1" Grid.Row="4"
FontSize="20" Click="NumberButton_Click"/>
<Button Content="3" Margin="2" Grid.Column="2" Grid.Row="4"
FontSize="20" Click="NumberButton_Click"/>
<Button Content="+" Margin="2" Grid.Column="3" Grid.Row="4"
FontWeight="bold" Click="OperationButton_Click"/>
<Button Content="0" Margin="2" Grid.Column="0" Grid.Row="5"
FontSize="20" Grid.ColumnSpan="2" Click="NumberButton_Click"/>
<Button x:Name="dec" Content="" Margin="2" Grid.Column="2" Grid.Row="5"
FontWeight="bold" Click="OperationButton_Click"/>
<Button Content="=" Margin="2" Grid.Column="3" Grid.Row="5"
FontWeight="bold" Click="OperationButton_Click"/>
</Grid>
</Window>