Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

converting int to decimal choosing where to put decimal place

Tags:

c#

decimal

I have an interesting problem, I need to convert an int to a decimal.

So for example given:

int number = 2423;
decimal convertedNumber = Int2Dec(number,2);
// decimal should equal 24.23

decimal convertedNumber2 = Int2Dec(number,3);
// decimal should equal 2.423

I have played around, and this function works, I just hate that I have to create a string and convert it to a decimal, it doesn't seem very efficient:

decimal IntToDecConverter(int number, int precision)
{
   decimal percisionNumber = Convert.ToDecimal("1".PadRight(precision+1,'0'));
   return Convert.ToDecimal(number / percisionNumber);
}
like image 420
Mike Jones Avatar asked Dec 01 '22 14:12

Mike Jones


1 Answers

Since you are trying to make the number smaller couldn't you just divide by 10 (1 decimal place), 100 (2 decimal places), 1000 (3 decimal places), etc.

Notice the pattern yet? As we increase the digits to the right of the decimal place we also increase the initial value being divided (10 for 1 digit after the decimal place, 100 for 2 digits after the decimal place, etc.) by ten times that.

So the pattern signifies we are dealing with a power of 10 (Math.Pow(10, x)).

Given an input (number of decimal places) make the conversion based on that.

Example:

int x = 1956;
int powBy=3;

decimal d = x/(decimal)Math.Pow(10.00, powBy);
//from 1956 to 1.956 based on powBy

With that being said, wrap it into a function:

decimal IntToDec(int x, int powBy)
 {
  return x/(decimal)Math.Pow(10.00, powBy);
 }

Call it like so:

decimal d = IntToDec(1956, 3);

Going the opposite direction

You could also do the opposite if someone stated they wanted to take a decimal like 19.56 and convert it to an int. You'd still use the Pow mechanism but instead of dividing you would multiply.

double d=19.56;
int powBy=2;
double n = d*Math.Pow(10, powBy);
like image 91
JonH Avatar answered Dec 10 '22 06:12

JonH