Я пытаюсь выяснить, как обрезать строку, поэтому я получаю только значение 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 для текстового поля:
Примеры записей INVALID:
Если формат является данным, то я не вижу такой большой проблемы:
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.");
Попробуйте регулярные выражения
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;
}
`
, которая слева от клавиши 1 на клавиатурах США) вокруг того, какие форматы ввода вы используете. Это трудно понять.