Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Конвертация строки в INT  [new]
Павел-П
Guest
Добрый день.

Подскажите, пжл, правильный способ конвертации строки в INT.
Должно работать следующим образом.
1. Если конвертация возможно возвращаться должно число.
2. Если конвертация невозможна - null
3. Никаких exception-ов быть не должно.

Заранее благодарен за ваши ответы.
23 дек 09, 16:33    [8108780]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Думающий
Member

Откуда: Месный
Сообщений: 963
declare @num as int
declare @str as varchar(8000)

set @num=null
if isnumeric(@str)=1 begin
set @num=cast(@str as int)
end
23 дек 09, 16:43    [8108881]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Думающий
Member

Откуда: Месный
Сообщений: 963
Хм, не приятно удивлен

declare @num as int
declare @str as varchar(8000)
set @str='1d2'

select isnumeric(@str)
23 дек 09, 16:48    [8108919]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Павел-П
Guest
Думающий,

Добрый день.
Вариант хороший.

Но как быть со строковым значением '.'.?
23 дек 09, 16:49    [8108932]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Павел-П
Guest
Павел-П,

Собственно, вопрос по этому и встал. ISNUMERIC не гарантирует, что выражение можно конвертировать в INT.
Как получить 100 гарантию, что выражение можно конвертировать в INT?

Наверняка профессионалы на этом форуме сталкивались с такой проблемой.
23 дек 09, 16:51    [8108954]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36827
Проверить строку на то, что в нее входят только разрешенные символы. Угадаете с трех раз, какие символы разрешены для конвертации в инт?
23 дек 09, 16:52    [8108962]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Думающий
Member

Откуда: Месный
Сообщений: 963
Павел-П,

100 % гарантию дает тип int, его и нужно использовать, остальное танцы с бубном...
Можно через substring вырезать все что после . , и т.д. , честно говоря никогда не было такой надобности
23 дек 09, 16:53    [8108974]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Думающий
Member

Откуда: Месный
Сообщений: 963
Гавриленко Сергей Алексеевич,

Что тоже не гарантирует что набор чисел, влезет в размерность int )
23 дек 09, 16:59    [8109032]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36827
Думающий
Гавриленко Сергей Алексеевич,

Что тоже не гарантирует что набор чисел, влезет в размерность int )
Проверка на длину плюс предварительная конвертация к бигинту и проверка на граничные значения.
23 дек 09, 17:00    [8109037]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Павел-П
Guest
Гавриленко Сергей Алексеевич,

Т.е. предлагаемый вариант, проверить наличие в строке только символов 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + пробелов.

1. Если строка подходит под предложенный формат, то конвертируем
2. Если строка не подходит под предложенный формат, не конвертируем, а возвращаем NULL

Большое спасибо за ваше предложение.
Интересно рассмотреть и другие варианты.
23 дек 09, 17:00    [8109042]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Думающий
Member

Откуда: Месный
Сообщений: 963
Павел-П,

Длинну строки не забудьте
23 дек 09, 17:02    [8109061]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Павел-П
Guest
Думающий,

Думаю, на размерности сильно заморачиваться не стоит.
Это проблема ясна и очевидна.
23 дек 09, 17:03    [8109066]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36827
Павел-П
Интересно рассмотреть и другие варианты.
Если вы ждете, что кто-нибудь расскажет вам про функцию ОтконвертитьВсякуюХреньВИнт(), то разочарую вас: нет такой.

Сообщение было отредактировано: 23 дек 09, 17:04
23 дек 09, 17:03    [8109067]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Павел-П
Guest
Гавриленко Сергей Алексеевич,

Меня не надо разочаровывать.

Отрицательный результат - это тоже результат.
Я задал этот вопрос, потому что возможно кто-то знает положительный результат, а Вы нет.

Большое спасибо за Ваш ответ.
23 дек 09, 17:04    [8109076]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
^^
Guest
Павел-П
Гавриленко Сергей Алексеевич,

Т.е. предлагаемый вариант, проверить наличие в строке только символов 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + пробелов.

1. Если строка подходит под предложенный формат, то конвертируем
2. Если строка не подходит под предложенный формат, не конвертируем, а возвращаем NULL

Большое спасибо за ваше предложение.
Интересно рассмотреть и другие варианты.



А INT разве не может быть отрицательным?
да, еще, а вы пробовали пробелы сконвертировать в INT?
23 дек 09, 17:04    [8109079]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SELECT S, CAST(CASE WHEN ISNUMERIC(S)=1 AND S NOT LIKE'%[^ 0-9+-]%' THEN S END AS BIGINT) BigIntField
FROM T
WHERE ISNUMERIC(S)=1 AND S NOT LIKE'%[^ 0-9+-]%';
А вот о проверке на переполнение надо ещё подумать...
23 дек 09, 17:08    [8109100]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
если isnumeric говорит что можно, значит можно, просто нужно правильно подойти к процессу конвертирования:)

declare @num as int
declare @str as varchar(8000)
set @str='1d2'

select isnumeric(@str),convert(int,convert(float,@str))
23 дек 09, 17:15    [8109156]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
WarAnt
если isnumeric говорит что можно, значит можно, просто нужно правильно подойти к процессу конвертирования:)

declare @num as int
declare @str as varchar(8000)
set @str='1d2'

select isnumeric(@str),convert(int,convert(float,@str))
А так?
declare @num as int
declare @str as varchar(8000)
set @str='$12'

select isnumeric(@str),convert(int,convert(float,@str))
23 дек 09, 17:18    [8109182]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Anddros
Member

Откуда:
Сообщений: 1077
WarAnt
если isnumeric говорит что можно, значит можно, просто нужно правильно подойти к процессу конвертирования:)

declare @num as int
declare @str as varchar(8000)
set @str='1d2'

select isnumeric(@str),convert(int,convert(float,@str))


Или так: :)

declare @num as int
declare @str as varchar(8000)
set @str=',1'

select isnumeric(@str),convert(int,convert(float,@str))
23 дек 09, 17:22    [8109216]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Думающий
Member

Откуда: Месный
Сообщений: 963
iap,
Вот вам надо всю идилию испортить)))) там и запятая не прокатит)
23 дек 09, 17:23    [8109218]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Anddros
Member

Откуда:
Сообщений: 1077
А еще есть такой замечательный символ: {TAB} - char(9)

:)
23 дек 09, 17:26    [8109240]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
Павел-П
Guest
^^,

Пробелы можно просто вырезать, к примеру. Это логично.
23 дек 09, 17:31    [8109275]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Думающий
iap,
Вот вам надо всю идилию испортить)))) там и запятая не прокатит)
Посмотрите-ка, сколько и каких красивых символов может быть в числовых строках:
Использование денежных данных


А вот рубля нашего там нет!

Что касается преобразования строки в числовые типы, на форуме десятки раз обсуждалось.
Вот тут, например, до меня впервые дошло, зачем нужна функция ISNUMERIC() :
ошибка при конвертации
23 дек 09, 17:32    [8109284]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
ISNUMERIC returns 1 when the input expression evaluates to a valid integer, floating point number, money or decimal type; otherwise it returns 0. A return value of 1 guarantees that expression can be converted to one of these numeric types.

тоесть в один из форматов конвертится точно, осталось узнать в какой, думаю не сложно определить при каких обстоятельствах в какой формат конвертится:)
23 дек 09, 17:33    [8109293]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация строки в INT  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Anddros
А еще есть такой замечательный символ: {TAB} - char(9)

:)
У меня что-то строка с табуляцией только во FLOAT конвертируется.
23 дек 09, 17:35    [8109306]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить