This time I’ll add one more test, a respective method, and then put together the WPF UI for the additional methods added in this part and part 3. With this additional method I’ll toss in a little validation too. So first I’ll go ahead and get the validation of string as a number method out of the way. First things first, going to get a couple tests running.
1: [Test]
2: public void TestStringIsNumberWithNumber()
3: {
4: string theTestString = "52";
5: Console.WriteLine(theTestString);
6: Console.WriteLine(MathCookbook.Functions.IsNumeric(theTestString));
7: Assert.IsTrue(MathCookbook.Functions.IsNumeric(theTestString));
8: }
9:
10: [Test]
11: public void TestStringIsNumberWithString()
12: {
13: string theTestString = "ThisIsObviouslyNotNumber";
14: Console.WriteLine(theTestString);
15: Console.WriteLine(MathCookbook.Functions.IsNumeric(theTestString));
16: Assert.IsFalse(MathCookbook.Functions.IsNumeric(theTestString));
17: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Then I’ll throw in the method needed to get a green light.
1: /// <summary>
2: /// This method returns a true or false depending on the passed parameter being a numeric value or not.
3: /// </summary>
4: /// <param name="valueToCheck">Enter the string value to check for numeric type.</param>
5: /// <returns>Returns true if the string is a number or false if it is alphanumeric.</returns>
6: public static bool IsNumeric(string valueToCheck)
7: {
8: Regex reg = new Regex(@"^[\+\-]?\d*\.?[Ee]?[\+\-]?\d*$", RegexOptions.Compiled);
9:
10: valueToCheck = valueToCheck.Trim();
11: Match m = reg.Match(valueToCheck);
12: return m.Value != string.Empty;
13: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Next I’ll start putting together the WPF needed to test execute these new methods. First the additional UI changes.
1: <Window x:Class="Maths.MathsCooking"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: Title="Maths Cooking" Height="768" Width="1024">
5: <Grid>
6: <TextBox Height="65" Margin="10,0,14,50" Name="textAnswers" VerticalAlignment="Bottom" />
7: <Button Height="23" HorizontalAlignment="Right" Margin="0,0,14,14" Name="exitApplicationButton" VerticalAlignment="Bottom" Width="75" Click="exitApplicationButton_Click">Exit</Button>
8: <GroupBox Header="Fraction Functions" Margin="18,20,489,0" Name="groupBox1" Height="187" VerticalAlignment="Top">
9: <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
10: <Button BorderThickness="3" Click="getApproximateEqualityButton_Click" Height="23" HorizontalAlignment="Right" Margin="0,0,18,23.085" Name="getApproximateEqualityButton" VerticalAlignment="Bottom" Width="150">Get Approximate Equality</Button>
11: <TextBox Height="23" Margin="190,10,198,0" Name="textNumerator" VerticalAlignment="Top" />
12: <TextBox Height="23" Margin="190,0,198,57.723" Name="textValue" VerticalAlignment="Bottom" />
13: <TextBox Height="23" Margin="190,0,198,21.723" Name="textEpsilon" VerticalAlignment="Bottom" />
14: <TextBox Height="23" Margin="190,48,198,0" Name="textDenominator" VerticalAlignment="Top" />
15: <Label Height="28" HorizontalAlignment="Left" Margin="10,10,0,0" Name="labelNumerator" VerticalAlignment="Top" Width="150">Numerator</Label>
16: <Label Height="28" HorizontalAlignment="Left" Margin="10,48,0,0" Name="labelDenominator" VerticalAlignment="Top" Width="150">Denominator</Label>
17: <Label Height="28" HorizontalAlignment="Left" Margin="10,0,0,16.723" Name="labelEpsilon" VerticalAlignment="Bottom" Width="150">Epsilon</Label>
18: <Label Height="28" HorizontalAlignment="Left" Margin="10,0,0,52.723" Name="labelValue"VerticalAlignment="Bottom" Width="150">A Value (Float or Double)</Label>
19: <Button BorderThickness="3" Click="getDecimalButton_Click" Height="23" HorizontalAlignment="Right" Margin="0,46.638,18,0" Name="getDecimalButton" VerticalAlignment="Top" Width="150">Get Decimal</Button>
20: </Grid>
21: </GroupBox>
22: <GroupBox Header="Is Numeric Check" Margin="18,223,489,0" Name="groupBox2" Height="69" VerticalAlignment="Top">
23: <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
24: <Button HorizontalAlignment="Right" Margin="0,12,18,14.723" Name="getIsNumberic" Width="150" Click="getIsNumberic_Click">Is Numeric</Button>
25: <Label HorizontalAlignment="Left" Margin="10,10,0,11.723" Name="labelIsNumeric" Width="120">Is Numeric?</Label>
26: <TextBox Margin="190,12,198,14.723" Name="textIsNumeric" />
27: </Grid>
28: </GroupBox>
29: </Grid>
30: </Window>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Now the additional functionality.
1: private void exitApplicationButton_Click(object sender, RoutedEventArgs e)
2: {
3: Close();
4: }
5:
6: private void getIsNumberic_Click(object sender, RoutedEventArgs e)
7: {
8: textAnswers.Text = Functions.IsNumeric(textIsNumeric.Text).ToString();
9: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Last but not least I’ll put in the validation so I don’t fat finger the wrong value types in the text boxes. This is a little tricky, but it works. In most environments you’d want to setup a decent validation framework for this, which might be one of my next blog entries.
1: #region
2:
3: using System;
4: using System.Windows;
5: using System.Windows.Controls;
6: using MathCookbook;
7:
8: #endregion
9:
10: namespace Maths
11: {
12: public partial class MathsCooking : Window
13: {
14: public MathsCooking()
15: {
16: InitializeComponent();
17: }
18:
19: private void getDecimalButton_Click(object sender, RoutedEventArgs e)
20: {
21: if (textNumerator.Text != string.Empty && Functions.IsNumeric(textNumerator.Text) &&
22: textDenominator.Text != string.Empty && Functions.IsNumeric(textDenominator.Text))
23: {
24: textAnswers.Text = Functions.GetDecimalOfFraction(
25: Convert.ToDouble(textNumerator.Text),
26: Convert.ToDouble(textDenominator.Text)).ToString();
27: }
28: else
29: {
30: MessageBox.Show(
31: "You must enter numeric values in the numerator and denominator text boxes.",
32: "Enter values!",
33: MessageBoxButton.OK,
34: MessageBoxImage.Hand,
35: MessageBoxResult.OK);
36: }
37: }
38:
39: private void getApproximateEqualityButton_Click(object sender, RoutedEventArgs e)
40: {
41: if (textNumerator.Text != string.Empty && Functions.IsNumeric(textNumerator.Text) &&
42: textDenominator.Text != string.Empty && Functions.IsNumeric(textDenominator.Text) &&
43: textValue.Text != string.Empty && Functions.IsNumeric(textValue.Text) &&
44: textEpsilon.Text != string.Empty && Functions.IsNumeric(textEpsilon.Text))
45: {
46: textAnswers.Text = Functions.IsApproximatelyEqualTo(
47: Convert.ToDouble(textNumerator.Text),
48: Convert.ToDouble(textDenominator.Text),
49: Convert.ToDouble(textValue.Text),
50: Convert.ToDouble(textEpsilon.Text)).ToString();
51: }
52: else
53: {
54: MessageBox.Show(
55: "You must enter numeric values in the numerator, denominator, value, and epsilon text boxes.",
56: "Enter values!",
57: MessageBoxButton.OK,
58: MessageBoxImage.Hand,
59: MessageBoxResult.OK);
60: }
61: }
62:
63: private void exitApplicationButton_Click(object sender, RoutedEventArgs e)
64: {
65: Close();
66: }
67:
68: private void getIsNumberic_Click(object sender, RoutedEventArgs e)
69: {
70: if (textIsNumeric.Text != string.Empty)
71: {
72: textAnswers.Text = Functions.IsNumeric(textIsNumeric.Text).ToString();
73: }
74: else
75: {
76: MessageBox.Show(
77: "Technically string.empty is not numeric, but it is more useful if you enter a value to check.",
78: "Enter a value!",
79: MessageBoxButton.OK,
80: MessageBoxImage.Hand,
81: MessageBoxResult.OK);
82: }
83: }
84: }
85: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
That’s that. Now I have a simple application available for providing some simple mathematical calculations. I’ll be creating another multi-part series, but next on the list will be something a bit different then some mathematical calculations. Instead I’ll be focusing on putting together some architectural pieces of an application.
The finished code can be downloaded from Codeplex, via the C# Cooking Project I’ve created.