View Sidebar

A Million Little Pieces Of My Mind

Organica: Percentage class

By: Paul S. Cilwa Viewed: 3/3/2024
Posted: 6/28/2021
Page Views: 901
Topics: #Organica #Shell #VB.NET #Percentageclass #object-orientedprogramming
A general purpose class for easily calculating percentages and values without bothering with all that math stuff.

I have dyslexia, and as a partial consequence I can never get the equation for calculating percentages right on the first try. Which side does the 100 go on, and is it divide or multiply? And so, for me at least, it makes sense to get it right once…in a reusable function (or, better yet, object) that I can reference by name when needed? And thus is born the Percentage class.

The premise of the class is that objects of this type could be used as properties for other objects that might need to store a value that can be expressed as either a percentage or a hard value (given a maximum value). In my current need there will never be negative or superfluous (+100%) percentages, so this class doesn't allow values below zero or higher than the provided maximum.

To create a file for the class to live in, use the Project..Add Class menu command and change the default name ("Class1") to "Percentage".

Clicking the Add button will open a code window for you with the class skeleton pre-typed.

Public Class Percentage End Class

Since, among the three entities Value, MaxValue, and Percent, any one can be derived from the other two, we only require the storage of two of them.

Public Class Percentage Private MyValue As Single Private MyMaxValue As Single Public Sub New(aValue As Single, aMaxValue As Single) MyMaxValue = aMaxValue MyValue = Math.Min(Math.Max(0, aValue), MyMax) End Sub End Class

The code to implement Value and MaxValue as properties is textbook basic.

Property Value As Single Set(aValue As Single) MyValue = Math.Min(Math.Max(0, aValue), MaxValue) End Set Get Return MyValue End Get End Property Property MaxValue As Single Set(aMax As Single) MyMaxValue = Math.Min(0, aMax) If MyMaxValue < MyValue Then MyValue = MyMaxValue End Set Get Return MyMaxValue End Get End Property

The fun is in the Percent property, since it must be calculated on demand, or used to change the Value property if written to.

Property Percent As Single Set(NewPercent As Single) NewPercent = Math.Min(Math.Max(0, NewPercent), 100) Value = MaxValue * NewPercent / 100 End Set Get Return Value / MaxValue * 100 End Get End Property

Stand-alone Functions

While the above code describes a useful class for when these values must be retained, it's also true that many times a percentage is needed to be calculated using pre-existing values, and instantiating an entire object is rather overkill. For these occasions, we can add Shared functions to the class. A Shared function is one that is called through the class name itself (as well as through an instantiated object), with all data provided via arguments.

Public Shared Function CalcPercentage(aValue As Single, aMaxValue As Single) As Single Return aValue / aMaxValue * 100.0 End Function Public Shared Function CalcValue(aPercentage As Single, aMaxValue As Single) As Single aPercentage = Math.Min(Math.Max(0, aPercentage), 100) Return aMaxValue * aPercentage / 100.0 End Function