powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Синтаксический разбор строк
6 сообщений из 6, страница 1 из 1
Синтаксический разбор строк
    #38845075
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте
Мне нужно переписать значения из одного adotable в другой.
Но при компиляции по двум значениям выходит ошибка: Входная строка имела неверный формат.
Совет: при преобразовании строки в дату/время выполните синтаксический разбор строки, чтобы получить дату перед помещением каждой переменной в объект.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
for (int i = 0; i < ClassInitSet.myDs.Tables["adotable1"].Rows.Count; ++i)
                {
                    DataRow nrow3;
                    nrow3 = ClassInitSet.myDs.Tables["adotable2"].NewRow();
                    nrow3["ID"] = System.Guid.NewGuid();
                    nrow3["SS"] = ClassInitSet.myDs.Tables["adotable1"].Rows[i]["SS"].ToString();
                    nrow3["LL"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["LL"].ToString())/100;

                    nrow3["Sk"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["Sk"].ToString());
                    nrow3["Re"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["Re"].ToString());

                    ClassInitSet.myDs.Tables["adotable2"].Rows.Add(nrow3);
                    nrow3.EndEdit();
                }


Ошибка при конвертации здесь:
Код: c#
1.
2.
3.
4.
5.
nrow3["Sk"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["Sk"].ToString());
                    nrow3["Re"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["Re"].ToString());

                    ClassInitSet.myDs.Tables["adotable2"].Rows.Add(nrow3);
                    nrow3.EndEdit();


В adotable1 значения Sk и Re прописаны как String (там пришлось удалять много символов), а в adotable2 как Decimal, а DataTime у меня вообще нет.
Значения в этих обеих полях всегда содержат точку:
Sk = 9.2
Re = 235665.24874
Из-за точек наверное и проблема. Как мне сделать синтаксический разбор этих строк? Примеров не нашла.
Заранее большое спасибо
...
Рейтинг: 0 / 0
Синтаксический разбор строк
    #38845135
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXL,

Если дело действительно в точке, то решить это можно установкой CultureInfo.InvariantCulture в методе ToDecimal() в качестве второго параметра:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                for (int i = 0; i < ClassInitSet.myDs.Tables["adotable1"].Rows.Count; ++i)
                {
                    DataRow nrow3;
                    nrow3 = ClassInitSet.myDs.Tables["adotable2"].NewRow();
                    nrow3["ID"] = System.Guid.NewGuid();
                    nrow3["SS"] = ClassInitSet.myDs.Tables["adotable1"].Rows[i]["SS"].ToString();
                    nrow3["LL"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["LL"].ToString(),CultureInfo.InvariantCulture)/100;
                    nrow3["Sk"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["Sk"].ToString(),CultureInfo.InvariantCulture);
                    nrow3["Re"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["Re"].ToString(),CultureInfo.InvariantCulture);

                    ClassInitSet.myDs.Tables["adotable2"].Rows.Add(nrow3);
                    nrow3.EndEdit();
                }


но это не избавит от проблем, если в ячейке будет пустая строка, или null, или вообще какой бред отличный от цифр. В таком случае лучше бы использовать Decimal.TryParse
...
Рейтинг: 0 / 0
Синтаксический разбор строк
    #38845176
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXL, попробуй вообще убрать ToString().
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DataTable adotable1 = ClassInitSet.myDs.Tables["adotable1"];
DataTable adotable2 = ClassInitSet.myDs.Tables["adotable2"];
for (int i = 0; i < adotable1.Rows.Count; ++i)
{
	DataRow nrow3 = adotable2.NewRow();
	nrow3["ID"] = Guid.NewGuid();
	nrow3["SS"] = adotable1.Rows[i]["SS"];
	nrow3["LL"] = Convert.ToDecimal(adotable1.Rows[i]["LL"])/100;
	
	nrow3["Sk"] = Convert.ToDecimal(adotable1.Rows[i]["Sk"]);
	nrow3["Re"] = Convert.ToDecimal(adotable1.Rows[i]["Re"]);
	
	adotable2.Rows.Add(nrow3);
}


Вообще раз ты работаешь с DataSet, то лучше было бы использовать типизированный DataSet и тогда проблем с преобразованием не будет.
P.S. Вызов EndEdit() здесь не нужен поэтому я его убрал.
...
Рейтинг: 0 / 0
Синтаксический разбор строк
    #38845195
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileXXL, попробуй вообще убрать ToString().
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DataTable adotable1 = ClassInitSet.myDs.Tables["adotable1"];
DataTable adotable2 = ClassInitSet.myDs.Tables["adotable2"];
for (int i = 0; i < adotable1.Rows.Count; ++i)
{
	DataRow nrow3 = adotable2.NewRow();
	nrow3["ID"] = Guid.NewGuid();
	nrow3["SS"] = adotable1.Rows[i]["SS"];
	nrow3["LL"] = Convert.ToDecimal(adotable1.Rows[i]["LL"])/100;
	
	nrow3["Sk"] = Convert.ToDecimal(adotable1.Rows[i]["Sk"]);
	nrow3["Re"] = Convert.ToDecimal(adotable1.Rows[i]["Re"]);
	
	adotable2.Rows.Add(nrow3);
}


Вообще раз ты работаешь с DataSet, то лучше было бы использовать типизированный DataSet и тогда проблем с преобразованием не будет.
P.S. Вызов EndEdit() здесь не нужен поэтому я его убрал.

Без ToString все тоже самое
...
Рейтинг: 0 / 0
Синтаксический разбор строк
    #38845200
XXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JeStoneXXL,

Если дело действительно в точке, то решить это можно установкой CultureInfo.InvariantCulture в методе ToDecimal() в качестве второго параметра:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                for (int i = 0; i < ClassInitSet.myDs.Tables["adotable1"].Rows.Count; ++i)
                {
                    DataRow nrow3;
                    nrow3 = ClassInitSet.myDs.Tables["adotable2"].NewRow();
                    nrow3["ID"] = System.Guid.NewGuid();
                    nrow3["SS"] = ClassInitSet.myDs.Tables["adotable1"].Rows[i]["SS"].ToString();
                    nrow3["LL"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["LL"].ToString(),CultureInfo.InvariantCulture)/100;
                    nrow3["Sk"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["Sk"].ToString(),CultureInfo.InvariantCulture);
                    nrow3["Re"] = Convert.ToDecimal(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["Re"].ToString(),CultureInfo.InvariantCulture);

                    ClassInitSet.myDs.Tables["adotable2"].Rows.Add(nrow3);
                    nrow3.EndEdit();
                }


но это не избавит от проблем, если в ячейке будет пустая строка, или null, или вообще какой бред отличный от цифр. В таком случае лучше бы использовать Decimal.TryParse

Большое спасибо. Этот вариант работает. В принципе null никогда не будет и будут только цифры.
Но хотелось бы узнать решение с Decimal.TryParse. Наверное, это более правильно.
...
Рейтинг: 0 / 0
Синтаксический разбор строк
    #38845308
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XXL,
более правильно в стороне держаться от задач подобных этой:
авторМне нужно переписать значения из одного adotable в другой.

через TryParse это выглядеть будет примерно так
Код: c#
1.
2.
3.
4.
5.
6.
7.
...
            decimal Sk = 0;
            if (Decimal.TryParse(ClassInitSet.myDs.Tables["adotable1"].Rows[i]["Sk"].ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out Sk))
                nrow3["Sk"] = Sk;
            else
                nrow3["Sk"] = DBNull.Value;
...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Синтаксический разбор строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]