Как добавить несколько номеров текстовых полей, и сохранить сумму как двойной в переменной

Вот моя проблема. Я хочу иметь возможность суммировать значения 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 потому что суммы уже doubles. Таким образом, вы можете сделать что-то простое, как это:

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, он отлично подходит для манипулирования данными, но не каждая проблема требует комплексного решения, я предпочитаю использовать простое чистое решение, которое легко поддерживать и легко понять другим. но опять же это только у меня:)

Другие вопросы по тегам