October 16, 2018
Hot Topics:

Introduction

You don't see overloaded operators used that much in custom code. And, in few business applications have I seen a request for fractions, but there was such a request made of me recently. Following a search on the web. I discovered news groups and Q&A sites where some of you did request a Fraction's class. So, I thought I'd share a solution.

In this article, you will learn how to implement a Fraction's class—which is ideally suited for overloaded operators, how to overload operators in Visual Basic, and get a quick reminder from your college days on the Euclidean algorithm for calculating the greatest common divisor.

An Overview

Turning a decimal number into a fraction encompasses a couple of specific steps. (There may be a faster, smaller way to convert decimals into fractions, but this solution works and uses some pretty neat elements of the .NET framework.) To convert a decimal number into a fraction, first note that .2 is equivalent to 2/10ths; thus, to solve the problem programmatically you need to:

• Save the sign
• Store the whole number
• Find the numerator
• Find the denominator
• Find the greatest common divisor and reduce the fraction

To complete a Fraction class and make it generally useful, you also want to support basic arithmetic operations on fractions and mixed arithmetic on fractions and decimal (or double) numbers. All of these elements are described in the remainder of this article with a complete code listing at the end of the article.

Determining the Sign with Regular Expressions

You can start anywhere, but logically people in the West are oriented to reading from left to right, so that's where you will start. Assuming you have a decimal (double or single) number or a string representing the same, you can strip and store the sign of the number. The following fragment uses a Regular Expression to determine whether a string—you can easily convert numeric strings to and from a string or numeric representation—contains a negative sign and then you store the sign as an integer—1 or -1.

```Private Sub SetSign(ByVal value As String)

If (Regex.IsMatch(value, "^-")) Then
Sign = -1
End If

End Sub
```

The Regular Expressions "^-" simply checks for a – symbol at the beginning of the input string.

Storing the Whole Number

The whole number is as easy to store as the minus sign. You could convert the string to an integer that would do the job for you. You could use Math.Abs to get the number as an absolute value (because you stored the sign), or you could extract the substring, from left to right, up to the index of the decimal point. The latter is the technique demonstrated in the SetWholePart method that will be added to the Fraction class.

```Private Sub SetWholePart(ByVal value As String, _
ByVal index As Integer)

Dim whole As String = value.Substring(0, index)
If (whole.Length > 0) Then
WholeNumber = Convert.ToInt32(whole)
End If

End Sub
```

The index of the decimal point is returned from the CheckNoDecimalPoint method, shown next.

```Private Function CheckNoDecimalPoint(ByVal number As Double) _
As Integer

Dim index As Integer = number.ToString().LastIndexOf(".")

If (index = -1) Then
WholeNumber = Convert.ToInt32(number)
End If

Return index

End Function
```

Finding the Numerator

The easy work is done. Next, you need to find the numerator (and denominator) from the mantissa or the decimal (or fractional) part of the number. The answer is simple: The decimal number without the decimal point is the numerator. For example, 3.2 has a mantissa of .2. The mantissa .2 is 2/10ths, so clearly the mantissa reveals the numerator of the fraction.

The method SetFractionalPart orchestrates setting the numerator and denominator by stripping the mantissa from your input value.

```Private Sub SetFractionalPart(ByVal value As String, _
ByVal index As Integer)
Dim fraction As String = value.Remove(0, index + 1)

If (fraction.Length > 0) Then
SetFractionalPart(fraction)
_numerator = Convert.ToInt32(fraction)
SetDenominator(fraction)
ReduceWithGcd()
End If
End Sub
```

SetFractionalPart clearly shows that you Remove all of the input value up to and including the decimal point and then convert the remaining digits to the numerator store as an integer.

Page 1 of 4

Comment and Contribute

(Maximum characters: 1200). You have characters left.

Enterprise Development Update

Don't miss an article. Subscribe to our newsletter below.

By submitting your information, you agree that developer.com may send you developer offers via email, phone and text message, as well as email offers about other products and services that developer believes may be of interest to you. developer will process your information in accordance with the Quinstreet Privacy Policy.

Most Popular Developer Stories

Thanks for your registration, follow us on our social networks to keep up-to-date