Преобразование вещественных типов в строковые

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Nik
Сообщения: 6
Зарегистрирован: 06 ноя 2004, 12:01

Преобразование вещественных типов в строковые

Сообщение Nik » 06 ноя 2004, 12:13

Hi, All!

Необходимо перевести Numeric(9,2) в varchar(32) в SQL-запросе. Вроде ничего сложного cast( x as varchar(32)), но возникает проблема отсечения незначащих нкулей, т.е. нпример число 500 в Numeric(9,2) хранится как 500.00, а вот вывести ее в varchar(32) надо как '500', но cast дает '500.00'. Как правильно отсекать нули справа? Или это только в UDF можно сделать?

Vemer

вариант

Сообщение Vemer » 08 ноя 2004, 15:32

Не проще использовать на клиенте TField.DisplayText + TField.DisplayFormat [0.00] (для Delphi) или подобное?

Nik
Сообщения: 6
Зарегистрирован: 06 ноя 2004, 12:01

Re: вариант

Сообщение Nik » 09 ноя 2004, 08:23

Vemer писал(а):Не проще использовать на клиенте TField.DisplayText + TField.DisplayFormat [0.00] (для Delphi) или подобное?
Не проще, на клиента это float поле напрямую не передается, а используется при формировании (объединении) другого _текстового_ поля, которое ужу и отдается клиенту. Так что все форматирование должно происходить средствами IB

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 ноя 2004, 10:55

ты что, числа в float хранишь???

Nik
Сообщения: 6
Зарегистрирован: 06 ноя 2004, 12:01

Сообщение Nik » 10 ноя 2004, 02:30

kdv писал(а):ты что, числа в float хранишь???
В этом случае - да, а что страшного? Я не знаю, сколько будет разрядов после запятой. Даже если число хранится как numeric(a,b), это не снимает изначальной постановки вопроса: как убрать правые незначащие нули после запятой (если они там есть) средствами IB/FB при конвертации в текстовый тип?

Владимир Каратаев
Сообщения: 22
Зарегистрирован: 01 ноя 2004, 11:11

Re: Преобразование вещественных типов в строковые

Сообщение Владимир Каратаев » 10 ноя 2004, 07:52

Добрый день!
Nik писал(а): Необходимо перевести Numeric(9,2) в varchar(32) в SQL-запросе. Вроде ничего сложного cast( x as varchar(32)), но возникает проблема отсечения незначащих нкулей, т.е. нпример число 500 в Numeric(9,2) хранится как 500.00, а вот вывести ее в varchar(32) надо как '500', но cast дает '500.00'. Как правильно отсекать нули справа? Или это только в UDF можно сделать?
это реализуется оч. просто с помощью UDF. на сайте полно готовых UDF с нужной функцией pos- найти подстроку в строке, т.е. знак ".", а потом использовать substring. в ya такая функция (pos) наверное уже встроена.

если использовать udf не хочется, то можно в цикле от 1 до 32 с помощью substring выделять по одному символу и добавлять его к выходной строке. выход из цикла, если конец строки или встретиться "." но мой совет- использовать udf.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 ноя 2004, 12:19

Nik писал(а):
kdv писал(а):ты что, числа в float хранишь???
В этом случае - да, а что страшного? Я не знаю, сколько будет разрядов после запятой. Даже если число хранится как numeric(a,b), это не снимает изначальной постановки вопроса: как убрать правые незначащие нули после запятой (если они там есть) средствами IB/FB при конвертации в текстовый тип?
страшно то, что float дает только 7 знаков после запятой, к тому же это вещественный тип, т.е. будут проблемы с округлением. numeric, кстати, никогда во float не отображается.

"незначащие" нули после запятой - на самом деле это не незначащие, а дробная часть. если тебе надо убрать дробную часть, то это значит либо округление, либо отбрасывание дробной части. Соответственно берем udf, и делаем нужную операцию.

Гость

Сообщение Гость » 12 ноя 2004, 17:23

kdv писал(а): страшно то, что float дает только 7 знаков после запятой, к тому же это вещественный тип, т.е. будут проблемы с округлением. numeric, кстати, никогда во float не отображается.

"незначащие" нули после запятой - на самом деле это не незначащие, а дробная часть. если тебе надо убрать дробную часть, то это значит либо округление, либо отбрасывание дробной части. Соответственно берем udf, и делаем нужную операцию.
А мне не нужна такая точность - 7 знаков. У меня поле - размерность дозировки товара (шампунь "Ромашка" 100,25 мл), больше 4-х не ожидается. Теперь вернемся к дробной части: мне ее _не надо_ отбрасывать или округлять, математически я все делаю в рамках тождества 10,25 = 10,2500. Надо изменить только символьное представление.

К слову, решение хранить нужное мне поле сразу в varchar(32) не пройдет, его еще и в вычислениях нужно использовать. Я пока решил хранить это поле и во float, и в varchar(32)

Гость

Re: Преобразование вещественных типов в строковые

Сообщение Гость » 12 ноя 2004, 17:28

Владимир Каратаев писал(а):Добрый день!


это реализуется оч. просто с помощью UDF. на сайте полно готовых UDF с нужной функцией pos- найти подстроку в строке, т.е. знак ".", а потом использовать substring. в ya такая функция (pos) наверное уже встроена.

если использовать udf не хочется, то можно в цикле от 1 до 32 с помощью substring выделять по одному символу и добавлять его к выходной строке. выход из цикла, если конец строки или встретиться "." но мой совет- использовать udf.
Уточню пример, "10,240" _или_ "10.240". Как преобразовать с помощью этих функций?

Ответить