Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема при переводе float в string, Разделитель целой и дробной части 
V
    Опции темы
Кнопа
Дата 6.2.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.2.2007
Где: Москва

Репутация: нет
Всего: нет



Всем привет!

При формировании запроса на вставку записи в базу, столкнулась с проблемой разделителя целой и дробной части числа. В список 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 )

Это сообщение отредактировал(а) Кнопа - 6.2.2007, 17:44
PM MAIL   Вверх
Rodman
Дата 6.2.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



конечно смотря какая СУБД, но так попробуй
Код

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);


Это сообщение отредактировал(а) Rodman - 6.2.2007, 17:56
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Кнопа
Дата 6.2.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.2.2007
Где: Москва

Репутация: нет
Всего: нет



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

Но надо попробовать, спасибо.
PM MAIL   Вверх
_hunter
Дата 6.2.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



для этого (да и вообще) рекомендуется использовать параметры. поэтому среду разработки указать не помешалобы...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Rodman
Дата 6.2.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



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

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

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Кнопа
Дата 7.2.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.2.2007
Где: Москва

Репутация: нет
Всего: нет



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 для всех запросов вставки/удаления... Но если другого варианта нет, то прийдется использовать параметры...
PM MAIL   Вверх
Rodman
Дата 7.2.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



Кнопа, допустим данные вводятся в эдиты, то
Код

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;
}


что на такое вариант отвечает???
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Кнопа
Дата 7.2.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.2.2007
Где: Москва

Репутация: нет
Всего: нет



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

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

А по-другому никак не выходит. smile 
PM MAIL   Вверх
Rodman
Дата 7.2.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



попробуй в самом MS SQL ручками написать запрос
Код

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

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

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

PM MAIL WWW Skype GTalk YIM MSN   Вверх
_hunter
Дата 7.2.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



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

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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Кнопа
Дата 7.2.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.2.2007
Где: Москва

Репутация: нет
Всего: нет



Rodman
Уже пробовала, работает. И в борланде работает с параметрами так, как ты написал.

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

_hunter
Да вроде ничем, если хорошо подумать. smile 
PM MAIL   Вверх
Rodman
Дата 7.2.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



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

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

хотелось бы довести до конца задание... т.е. - без параметров... если тебе реально такое необходимо - то попробуй найти результат в моей прошлой инструкции
PM MAIL WWW Skype GTalk YIM MSN   Вверх
JackYF
Дата 8.2.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.