Как добавить несколько номеров текстовых полей, и сохранить сумму как двойной в переменной
Вот моя проблема. Я хочу иметь возможность суммировать значения 10 текстовых полей в переменную двойного типа.
Проблема в том, что значения текстового поля заполняются базой данных и не всегда заполняются. Я хочу, чтобы иметь возможность суммировать значения всех 10 без применения значения по умолчанию ноль в текстовых полях, которые являются нулевыми.
amount = Convert.ToDouble(amount1TextBox.Text + amount2TextBox.Text + amount3TextBox.Text + amount4TextBox.Text + amount5TextBox.Text + amount6TextBox.Text + amount7TextBox.Text + amount8TextBox.Text + amount9TextBox.Text + amount10TextBox.Text);
7 ответов
Вы не можете добавлять строки и ожидать, что они суммируются численно. Вы просто объедините текст.
Вы должны использовать Double.TryParse
чтобы проверить, может ли строка быть проанализирована:
double d1;
double.TryParse(amount1TextBox.Text, out d1));
double d2
double.TryParse(amount2TextBox.Text, out d2));
// and so on ...
double result = d1 + d2 + .... + d10;
Как насчет метода расширения для TextBox
:
namespace System
{
public static class Extensions
{
public static double AsDouble(this TextBox t)
{
double val;
double.TryParse(t.Text, out val);
return val;
}
}
}
и тогда вы можете использовать это так:
var amt = amount1TextBox.AsDouble() +
amount2TextBox.AsDouble() +
amount3TextBox.AsDouble() +
amount4TextBox.AsDouble() +
amount5TextBox.AsDouble() +
amount6TextBox.AsDouble() +
amount7TextBox.AsDouble() +
amount8TextBox.AsDouble() +
amount9TextBox.AsDouble() +
amount10TextBox.AsDouble();
Это также означает, что в любое другое время вам нужно получить значение TextBox
как double
это действительно прямо вперед; в любой форме в приложении!
Извините, вам нужно проверить значение каждого текстового поля. Это будет немного чище, чтобы сделать это отдельной функцией:
public double GetValue(string text)
{
if(string.IsNullOrEmpty(text))
return 0;
double value;
if(double.TryParse(text, out value))
return value;
// not parsable
return 0;
}
и позвонить
amount =
GetValue(amount1TextBox.Text) +
GetValue(amount2TextBox.Text) +
GetValue(amount3TextBox.Text) +
GetValue(amount4TextBox.Text) +
GetValue(amount5TextBox.Text) +
GetValue(amount6TextBox.Text) +
GetValue(amount7TextBox.Text) +
GetValue(amount8TextBox.Text) +
GetValue(amount9TextBox.Text) +
GetValue(amount10TextBox.Text);
У тебя здесь происходит пара вещей. Во-первых, вы используете +
оператор на строках, который собирается объединить их как строки вместо суммирования их как числа. Поэтому вам нужно сначала преобразовать их в числа.
Конечно, это может быть немного раздутым со всеми этими текстовыми полями. Но, похоже, у вас есть бизнес-логика, которая может сделать это проще. Вам не нужно заставлять текстовые поля отображать 0
, но вы можете по умолчанию их значение 0
при отсутствии действительного значения.
Вы можете начать с создания простого метода расширения для TextBox
чтобы получить его числовое значение или значение по умолчанию 0
, Что-то вроде этого:
public static double GetAmount(this TextBox t)
{
double result = 0;
double.TryParse(t.Text, out result);
return result;
}
Для любого данного TextBox
Теперь вы можете легко получить числовое значение с помощью:
amount1TextBox.GetAmount();
Это также означает, что вы можете суммировать их, а не объединять, и вам не нужно конвертировать сумму в double
потому что суммы уже double
s. Таким образом, вы можете сделать что-то простое, как это:
amount = amount1TextBox.GetAmount() +
amount2TextBox.GetAmount() +
//...
amount10TextBox.GetAmount();
Немного веселья с Linq
,
var total = new[]{ amount1TextBox, amount2TextBox ,amount3TextBox, ...}
.Sum(x=> x.AsDouble());
Где как AsDouble от ответа неоистеоне.
Немного LINQ:
amount = Controls.OfType<TextBox>()
.Where(tb => tb.Name.StartsWith("amount"))
.Select(tb => tb.Text)
.Where(s => !String.IsNullOrEmpty(s))
.Sum(s => Int32.Parse(s));
Предполагается, что ваши текстовые поля пусты или имеют номера. Если в эти текстовые поля можно ввести какой-то текст, то последняя строка должна выглядеть так:
.Sum(s => { int i; return Int32.TryParse(s, out i) ? i : 0; })
Я знаю, что вы уже выбрали ответ, который подходит вам, но потому, что вы попросили привести пример, и потому, что другие люди могут захотеть найти другие решения, я бы не стал.
private double GetSum(params TextBox[] arr)
{
double sum = 0;
double temp;
foreach (TextBox txt in arr)
{
double.TryParse(txt.Text,out temp);
sum += temp;
}
return sum;
}
и использовать это:
double a = GetSum(new TextBox() { Text = "1" }, new TextBox() { Text = "1" }, new TextBox() { Text = "1" }, new TextBox() { Text = "a" });
На заметку, мне нравится linq, он отлично подходит для манипулирования данными, но не каждая проблема требует комплексного решения, я предпочитаю использовать простое чистое решение, которое легко поддерживать и легко понять другим. но опять же это только у меня:)