Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема при переводе float в string


Автор: Кнопа 6.2.2007, 17:42
Всем привет!

При формировании запроса на вставку записи в базу, столкнулась с проблемой разделителя целой и дробной части числа. В список Values запроса Insert нужно включить два значения, которые хранятся в переменных типа double. Когда я преобразую их (явно или неявно) к типу String, разделителем целой и дробной части стоновится запятая, а не точка. Это приводит к формированию неправильного запроса. 
например:
Код

a1=18.4;
a2=5.05;
WriteQuery->SQL->Text="Insert into MyTable (f1, f2) values ("+a1+","+a2+")";

При этом, результирующий запрос выглядит так:
Код

Insert into MyTable (f1, f2) values (18,4,5,05)
Что, естественно, выдает ошибку...

Варианты:
Код

"values ("+String(a1)+","+String(a2)+")";
"values ("+FloatToStr(a1)+","+FloatToStr(a2)+")";

дают тоже самое smile 

Как мне преобразовать числа в строку, чтобы разделителем была точка? (крайний вариант найти символ ',' и заменить на '.' не привлекает smile )

Автор: Rodman 6.2.2007, 17:51
конечно смотря какая СУБД, но так попробуй
Код

a1=18.4;
a2=5.05;
WriteQuery->SQL->Text="Insert into MyTable (f1, f2) values ('"+a1+"','"+a2+"');";


или
Код

WriteQuery->SQL->Text="Insert into MyTable (f1, f2) values ('"+Float(a1)+"','"+Float(a2)+"');";


Цитата(Кнопа @  6.2.2007,  16:42 Найти цитируемый пост)
При этом, результирующий запрос выглядит так:
Выделить всёкод SQL

Insert into MyTable (f1, f2) values (18,4,5,05)
Что, естественно, выдает ошибку...

а так?
Код

Insert into MyTable (f1, f2) values (18.4,5.05);

Автор: Кнопа 6.2.2007, 17:56
СУБД MS SQL, там вроде в кавычки строчные поля заключаются, а у меня поля числовые.

Но надо попробовать, спасибо.

Автор: _hunter 6.2.2007, 18:00
для этого (да и вообще) рекомендуется использовать параметры. поэтому среду разработки указать не помешалобы...

Автор: Rodman 6.2.2007, 18:30
ну если есть необходимость с парамтрами, то
Код

WriteQuery->SQL->Text="Insert into MyTable (f1, f2) values (:Prm1,:Prm2);";
WriteQuery->ParamByName("Prm1")->AsFloat=a1;
WriteQuery->ParamByName("Prm2")->AsFloat=a2;
WriteQuery->ExecSQL;

Автор: Кнопа 7.2.2007, 10:26
Rodman
Кавычки не проходят, так как поля типа float, а не varchar/char. Сервер отказывается исполнять такой инсерт.
Цитата

или
  WriteQuery->SQL->Text="Insert into MyTable (f1, f2) values ('"+Float(a1)+"','"+Float(a2)+"');"; 
 
Во-первых, не узнает компилятор такой функции Float(), а во-вторых, даже если явно приводить тип: 
... values ('"+(double)a1+...
то во время формирования строки, компилятор преобразовывает эти переменные к типу строка (насколько я понимаю), и эффект тот же (разделитель - запятая).

Цитата

а так?
Insert into MyTable (f1, f2) values (18.4,5.05); 


Так-то правильно, но я не знаю изначально значений а1, а2 - они вводятся пользователем.

_hunter
Компилятор: BORLAND C++ BUILDER 6.0
Параметры не очень хотелось бы использовать, так как хотела использвать один TADOQuery для всех запросов вставки/удаления... Но если другого варианта нет, то прийдется использовать параметры...

Автор: Rodman 7.2.2007, 11:59
Кнопа, допустим данные вводятся в эдиты, то
Код

if((TryStrToFloat(Edit1->Text, a1)==TRUE)&&(TryStrToFloat(Edit2->Text, a2)==TRUE))
{   WriteQuery->SQL->Text="Insert into MyTable (f1, f2) values (:Prm1,:Prm2);";
     WriteQuery->ParamByName("Prm1")->Value=a1;
     WriteQuery->ParamByName("Prm2")->Value=a2;
     WriteQuery->ExecSQL;
}


что на такое вариант отвечает???

Автор: Кнопа 7.2.2007, 12:03
Rodman
Большое спасибо, с параметрами все работает. Просто не хотелось использовать параметры, т.к. 
Цитата

_hunter, 
Компилятор: BORLAND C++ BUILDER 6.0
Параметры не очень хотелось бы использовать, так как хотела использвать один TADOQuery для всех запросов вставки/удаления... Но если другого варианта нет, то прийдется использовать параметры... 

А по-другому никак не выходит. smile 

Автор: Rodman 7.2.2007, 12:36
попробуй в самом MS SQL ручками написать запрос
Код

Insert into MyTable (f1, f2) values (18.4,5.05); 

если не прокатит - попробуй:
- с кавычками поэкспериментируй
- с запятыми... 
- т.д.

но найди вариант который пракатит, и выложи... попробуем его привести в нормальный вид из борланда...

Автор: _hunter 7.2.2007, 13:05
Цитата(Кнопа @  7.2.2007,  10:26 Найти цитируемый пост)
Параметры не очень хотелось бы использовать, так как хотела использвать один TADOQuery для всех запросов вставки/удаления...

а чем тут мешают параметры?

Автор: Кнопа 7.2.2007, 14:24
Rodman
Уже пробовала, работает. И в борланде работает с параметрами так, как ты написал.

Все ра-бо-та-ет! Нужно было использовать параметры.

_hunter
Да вроде ничем, если хорошо подумать. smile 

Автор: Rodman 7.2.2007, 15:25
Цитата(Кнопа @  7.2.2007,  13:24 Найти цитируемый пост)
Уже пробовала, работает. И в борланде работает с параметрами так, как ты написал.

я понял что работает...

хотелось бы довести до конца задание... т.е. - без параметров... если тебе реально такое необходимо - то попробуй найти результат в моей прошлой http://forum.vingrad.ru/topic-135689.html#

Автор: JackYF 8.2.2007, 18:07
А что мешает в полученных String'ах перед передачей в функцию заменять "," на "."?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)