Rounding to midpoint of decimal place using ToString only - c#

I know that C# has some options to format decimal numbers with some extended logic in the ToString() method, as e.g.
double d1 = 1.3333;
double d2 = 1.6666;
string d1Str = d1.ToString("#0.00"); // 1.33
string d2Str = d2.ToString("#0.00"); // 1.67
That's great, my number is rounded to the second decimal. But what if I wanted to round to a step of 0.05 instead of 0.01? Is there a way to use the ToString() method in a similar way to round the value not to a given step-size (e.g. 0.05)?
Note: I know I could do something like this:
(Math.Round(1.33333*20)/20).ToString();
but the question is about getting this result using ToString() only.

Is it possible for you to create an extension overload for ToString() for these components?
If so you could write something like:
public static class DoubleStaticExtension
{
public static string ToString(this double value, string format, int decimalToRoundHalfwayAt)
{
int modifier = 2 * (int)Math.Pow(10, decimalToRoundHalfwayAt -1 );
return (Math.Round(value * modifier, MidpointRounding.AwayFromZero) / modifier).ToString(format);
}
}
Calling that with
double d = 9.333333;
string result = d.ToString("#0.00", 2);
Would give a result of 9.35
And
double d = 9.333333;
string result = d.ToString("#0.00", 1);
Would give a result of 9.50

Related

Print hexadecimal code from int into string

I need to save a string with the hexadecimal code of an int.
For example the hexadecimal value for the int 15 is xoooF.
My problem is that I have to save this code in a string like this:
int myint = myStringLength; //this value might change
string myIntExhCode = myint.convertThisIntoMyCode();
//and the string has to be exactly "/xoooF"
So in this question I have two problmes:
The first is how to automatically convert an int into the hexadecimal code like 15 = xoooF
The second is how to create a string containing \xoooF because any try of concatenating strings like this resulted into a \\xoooF and this is not correct since in output I need the string to be converted into the ascii code.
How can I achieve those two tasks?
Any help will be appreciated
Your question is quite vague. If you want hexadecimal format, but with 0 (digit zero) changed into o (small latin letter o) you can implement, say, an extension method (in order to keep your proposed code intact):
public static partial class IntExtensions {
public static string convertThisIntoMyCode(this int value) {
return "\\x" + value.ToString("X4").Replace('0', 'o'); // or "/x" + ...
}
}
...
int myint = myStringLength; //this value might change
string myIntExhCode = myint.convertThisIntoMyCode();
// Test output
Console.Write(myIntExhCode);
How about
int i = 15;
string result = "\\x" + i.ToString("X").PadLeft(4, 'o');

Specify decimal places using variables inside string interpolation

I have a string format which includes two integer variables, each of which needs to be formatted to a variable length:
int x = 1234;
int y = 42;
// Simplified, real values come from method outputs, so must use the variables:
int xFormatDigitCount = 7;
int yFormatDigitCount = 3;
var xStringFormat = new string('0', xFormatDigitCount); // "0000000"
var yStringFormat = new string('0' ,yFormatDigitCount); // "000"
For now I only managed to get the desired format using the integer variables' .ToString() methods:
var xString = x.ToString(xStringFormat);
var yString = y.ToString(yStringFormat);
return $"{xString}-{yString}";
But this seems like an overhead since string interpolation supports the format {var:format}. Is there a way to get my string with only string interpolation, without using x and y's ToString()?
I'm not sure I understand the question, but format specifiers for string.Format and, thus, string interpolation are textual - they don't accept variables.
You either use static format specifiers:
$"{x:0000000}-{y:000}"
Or resort to the good old string.Format:
string.Format(
$"{{0:{new string('0', xFormatDigitCount)}}}-{{1:{new string('0', yFormatDigitCount)}}}",
x,
y);
Edit:
Based on weston's answer:
$"{x.ToString($"D{xFormatDigitCount}")}-{y.ToString($"D{yFormatDigitCount}")}"
Is there a way to get my string with only string interpolation, without using x and y's ToSTring()
I don't believe so, but it can be so much cleaner thanks to ToString("Dx"):
All in one (nested interpolations):
public string Format(int x, int y, int xDigitCount, int yDigitCount)
{
return $"{x.ToString($"D{xDigitCount}")}-{y.ToString($"D{yDigitCount}")}";
}
Stack Overflow syntax highlighting can't keep up, so it looks odd, but this is how it looks in VS:
You can just call the ToString method within the interpolated string.
$"{x.ToString(xStringFormat)}-{y.ToString(yStringFormat)}"

How to call .cs file from a .aspx.cs in asp.net

Is it possible to store this method with labels in class file?
Example:
aspx.cs
private void addSalat()
{
decimal sum= Convert.ToDecimal(Label6.Text);
decimal sum2= Convert.ToDecimal(Label17.Text);
decimal sum3= Convert.ToDecimal(Label54.Text);
decimal sum4= Convert.ToDecimal(Label66.Text);
decimal sum5= Convert.ToDecimal(Label78.Text);
decimal sum6= Convert.ToDecimal(Label90.Text);
decimal sum7= Convert.ToDecimal(Label102.Text);
decimal sum8= Convert.ToDecimal(Label114.Text);
decimal sum9= Convert.ToDecimal(Label126.Text);
decimal sum= sum+ sum2+
sum3+ sum4+ sum5+ sum6+ sum7+ sum8
+ sum9;
Label42.Text = sum.ToString();
}
//do calculations here and call this method in aspx.cs file, i dont't know how to put here labels if is possible:
public class Class1
{
public void Sum()
{
decimal sum= Convert.ToDecimal(Label6.Text);
decimal sum2= Convert.ToDecimal(Label17.Text);
decimal sum3= Convert.ToDecimal(Label54.Text);
decimal sum4= Convert.ToDecimal(Label66.Text);
decimal sum5= Convert.ToDecimal(Label78.Text);
decimal sum6= Convert.ToDecimal(Label90.Text);
decimal sum7= Convert.ToDecimal(Label102.Text);
decimal sum8= Convert.ToDecimal(Label114.Text);
decimal sum9= Convert.ToDecimal(Label126.Text);
decimal sum= sum+ sum2+
sum3+ sum4+ sum5+ sum6+ sum7+ sum8
+ sum9;
Label42.Text = sum.ToString();
}
}
You would have to do something like this:
private decimal Sum(decimal firstValue, params decimal[] moreValues)
{
decimal val = firstValue;
return val + moreValues.Sum(); // Note this is not recursion. It is calling the LINQ Sum() function.
}
And call it like this:
Sum(5.2); // returns 5.2
Sum(6, 10); // returns 16
Sum(1,2,3); // returns 6
Or something like this:
decimal sum = Sum(Convert.ToDecimal(Label6.Text),
Convert.ToDecimal(Label17.Text),
Convert.ToDecimal(Label54.Text)
// and so forth
);
I would just leave it in the code-behind of the page. Since you're basically just adding values there's not a lot to gain by splitting it into a different class. If you were doing more complex calculations that needed unit testing, etc. then I would consider splitting it out.
You could also make the code a little cleaner by using Linq to sum the values:
decimal sum = new [] {Label6, Label17, Label54, Label66, Label78, Label90, Label102, Label114, Label126}
.Sum(lbl => Convert.ToDecimal(lbl.Text));

trying to create a extension method to convert from string to decimal

I'm trying to come up with a global way of converting a string to X number of decimal places and I'm having no luck. I need this to return a decimal with X number of decimals.
Here is what I have so far but I cannot figure out how to get it to know what to divide by easily:
public static decimal ToXDecimalPlaces(this object value, int numberofdecimalplaces, decimal defaultValue = 0)
{
double retval;
if (double.TryParse(value.ToString(), out retval))
{
return (decimal)(retval / 10);
}
return defaultValue;
}
So if I send it:
value = "12345"
value.ToXDecimalPlaces(2)
I'd like to get back:
123.45
etc.
The division of the retval needs to be different pending on the numberofdecimalplaces.
Any suggestions? I would prefer not to have to create a handful of extension methods or is that what I should do?
Should I just create:
To1DecimalPlaces
To2DecimalPlaces
To3DecimalPlaces
etc
For each one I need and move on?
How about using Math.Pow?
Something like
return (decimal)(retval / Math.Pow(10, numberofdecimalplaces));

converting double/floating to integer in C#

My question might looks like silly, but i struck with it.
I have a string value "155.300" and i want to convert it to integer.
I tryed but throwing System.FormatException....pls someone help me out.
Since your source data is string you need to Convert it to Double first then just cast it to int or use Convert.ToInt32, but remember Convert.ToInt32 rounds it to nearest integer number, whereas casting takes the int part of the number (truncate)
double d = Convert.ToDouble("155.00");
int a = (int) d;
int b = Convert.ToInt32(d);
Or in a single Line
int b =(int) Convert.ToDouble("155.000");
EDIT
Since you want to use decimal point as thousand separator, I believe in German culture you can try the following.
int b = ((int)Convert.ToDouble("154.500", new CultureInfo("de-DE")));
That will give you 154500
EDIT 2
Or much better is to use int.Parse with NumberStyles.AllowThousands:
int b = int.Parse("154.500", NumberStyles.AllowThousands, new CultureInfo("de-DE"));
First parse it as a decimal or double (probably best to use decimal as you've got decimal data) then either cast or use something like Math.Round, depending on your requirements.
Basically, you need to always consider what data you've got: "155.300" isn't a string representation of an integer, so don't try to parse it as an integer. Parse it as what it is, then convert that to an integer.
Alternatively, you could hack at the string representation first, but personally I find that to be a more brittle approach in many cases.
EDIT: Note that if this is really already an integer, but with a thousands separator, you don't need to use double at all - you can use int.Parse, specifying an appropriate culture and number style:
int parsed = int.Parse(text, NumberStyles.Integer | NumberStyles.AllowThousands,
culture);
Here is a working conversion sample. Take a special look with the edge conditions, the output may be different if using several rounding/casting techniques
class Program
{
public static int MyToInt(string str)
{
double result;
bool success = Double.TryParse(str, out result);
if (!success)
{
throw new ArgumentException(
"Cannot parse a string into a double");
}
return Convert.ToInt32(result); // 156
//return (int)result; // 155 <<
//return (int)Math.Round(result); // 156
}
static void Main(string[] args)
{
string s = "155.500";
int value = MyToInt(s);
}
}
You can try this:
string str = "123.123";
str = str.Remove(str.IndexOf('.'), 1);
int result;
int.TryParse(str, out result);
Edit: Based on your comment, modified to multiply by thousand.
Or you can just try:
string str = "123.123";
double result;
double.TryParse(str, out result);
int final = (int)(result * 1000);

Categories

Resources