Обрезать содержимое строки, чтобы получить только значение идентификатора

1

Я пытаюсь выяснить, как обрезать строку, поэтому я получаю только значение ID int. У меня есть текстовое поле, которое может принимать значения идентификатора, если они отформатированы как [@ID = #] 9. Он также может принимать BP [который означает "базовая цена"] и действительные числа и математические операторы). Мне нужно сделать, чтобы получить номер в этой строке и проверить, является ли он действительным идентификатором. Я создал функцию, которая обрезает ненужные символы и получает только идентификатор:

protected int CheckValidID(string idString)
{
    bool IsValid = false;
    int ValidID = 0;
    String trimmedId = idString.Trim(new Char[] { ' ', '[', '@', 'I', 'D', '=', ']' });

    using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AbleCommerce"].ToString()))
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT OptionChoiceId FROM ac_OptionChoices WHERE OptionChoiceId = @OptionChoiceID";
        cmd.Parameters.AddWithValue("@OptionChoiceID", trimmedId);
        cn.Open();

        using (IDataReader reader = cmd.ExecuteReader())
        {
            if (reader.Read())
                if (reader["OptionChoiceId"].ToString() != "")
                {
                    IsValid = true;
                    ValidID = Convert.ToInt32(reader["OptionChoiceId"]);
                }

        }
        cn.Close();
    }
    return ValidID;
}

Если идентификатор, который был принят, действителен, тогда мне нужно заменить этот идентификатор номером (любым числом).

 if (PriceFormula.Text != "")
    {
        string pFormula = PriceFormula.Text;
        if (pFormula.Contains("@ID"))
        {
            CheckValidID(pFormula);
            if (CheckValidID(pFormula) != 0)
                pFormula = pFormula.Replace(PriceFormula.Text, "2");
        }
        pFormula = pFormula.Replace("BP", "2");
        pFormula = pFormula.ToLower();      
        try
        {
            double n = 0;
            bool priceVal = (!Double.TryParse(ItemLookUp.evalExpression(pFormula).ToString(), out n));
        }
        catch (Exception x)
        {
            isValid = false;
            ErrorNote.Text += "This new option choice has an invalid Price Formula. <br />";
        }

    }

Проблема заключается в том, что пользователь вводит что-то вроде [@ID = #] * 9, которое должно быть действительным, но не работает для того, что я настроил. Кроме того, он не работает, даже если пользователь вводит действительный идентификатор. Как я могу настроить вещи так, чтобы я мог получить только идентификационную часть [@ID = #], независимо от того, вводится ли она в текстовое поле самостоятельно или с помощью чисел и математических операторов?

В конце концов, мне нужно проверить, действительно ли то, что вводит пользователь, возвращает действительный результат (в данном случае действительный двойной). Либо ID, либо текст BP заменяются числом (здесь я использую 2), и это позволяет тестировать формулу. Но это идентификационная часть, которая заставила меня застрять.

Примеры записей VALID для текстового поля:

  1. [@J = 532134]
  2. [@J = 828718] * 2
  3. [@J = 347479] * 3 + 2
  4. BP * 2
  5. BP+ 6
  6. BP * 5 + 3

Примеры записей INVALID:

  1. [ID = 38288]
  2. @ID = 383793
  3. [@ID = 39371] +
  4. BP+
  5. BP * 2'
  6. BP+ 9 *
  7. До н.э. * 6
  • 1
    Пожалуйста, поставьте галочки (клавиша ` , которая слева от клавиши 1 на клавиатурах США) вокруг того, какие форматы ввода вы используете. Это трудно понять.
  • 1
    Не совсем понятно, что вы пытаетесь сделать здесь. Можете ли вы добавить несколько примеров строк, которые могут быть введены, и какую часть вы на самом деле пытаетесь извлечь. С некоторыми случаями, которые являются приемлемыми, а некоторые - неудачными.
Показать ещё 5 комментариев
Теги:
string
replace

2 ответа

2
Лучший ответ

Если формат является данным, то я не вижу такой большой проблемы:

 var startIndex= inputString.IndexOf("[@ID=");
 var endIndex = inputString.LastIndexOf("]");

 if (startIndex < 0 || endIndex < startIndex)
     throw new ArgumentException("Format is not valid.");

 startIndex += "[@ID=".Length;
 var potentialIdString = inputString.Substring(startIndex, endIndex - startIndex);
 int id;

 if (int.TryParse(potentialIdString, out id))
      return id;
 else
     throw new ArgumentException("ID is not valid.");
  • 0
    Кажется, это сработало для меня. Спасибо!
0

Попробуйте регулярные выражения

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex(v=vs.110).aspx

public int CheckValidID(string idString)
{

    Regex rg = new Regex(@"\d*",RegexOptions.IgnoreCase);

    string val = rg.Match(idString).Value;

    int ValidID = Convert.ToInt32(val);

    return ValidID;

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню