求一个字符中取数字的函数,有些许要求

chenhao3947 2008-09-09 12:53:05
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_strtonum2]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_strtonum2]
GO

Create Function f_strtonum2 ( @str varchar(200)) Returns numeric(19,3)
WITH ENCRYPTION
AS
begin
declare @len int,@i int,@err int,@temp varchar(200),
@ret numeric(19,3),@tstr varchar(200)
select @len=0,@i=0,@ret=0,@err=0,@temp=''
if rtrim(@str)='' or @str is null
set @err=1
--数字,退出
if isnumeric(@str)=1 and @err=0
select @ret=cast(@str as numeric(19,3)),@err=1

if @err=0
begin
select @str=rtrim(@str),@len=len(rtrim(@str))
--
if isnumeric(left(@str,1))=1 and @err=0 and left(@str,1) not in('.',',','+','-')
begin
while @i<=@len
begin
select @i=@i+1,@tstr=left(@str,@i)
if isnumeric(@tstr)=0
begin
select @ret=cast(left(@tstr,@i-1) as numeric(19,3))
break
end
else
continue
end
set @err=1
end
end
return @ret
end
go
[/code]
...全文
170 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
-狙击手- 2008-09-09
  • 打赏
  • 举报
回复

create function f_str(@str varchar(400))
returns numeric(12,2)
as
begin
while patindex('%[^0-9]%',@str)>0
begin
set @str = stuff( @str, patindex('%[^0-9]%',@str) ,1 ,'')
end
return cast(@str as numeric(12,2))
end
go

select dbo.f_str('saf123asd234')
drop function f_str

/*
--------------
123234.00

(所影响的行数为 1 行)
*/
chenhao3947 2008-09-09
  • 打赏
  • 举报
回复
强大!!
谢谢pt1314917
林虎 2008-09-09
  • 打赏
  • 举报
回复
。。
pt1314917 2008-09-09
  • 打赏
  • 举报
回复

--考虑到四楼说的情况,将函数完善一下(主要包括多符号时,以及符号在数字后面等情况。)
create function GetNumbers(@var varchar(50))
returns numeric(12,3)
as
begin
declare @num varchar(50)
set @num=''
if(patindex('%[0-9]%',@var)=0)
set @num='0'
else
begin
while(patindex('%[0-9.+-]%',@var)>0)
begin
if(substring(@var,patindex('%[0-9.+-]%',@var),1) in (',','+','-') and (patindex('%[.+-]%',@num)>0 or patindex('%[0-9]%',@num)>0))
begin
set @var=stuff(@var,patindex('%[0-9.+-]%',@var),1,'')
continue;
end
else
begin
set @num=@num+substring(@var,patindex('%[0-9.+-]%',@var),1)
set @var=stuff(@var,patindex('%[0-9.+-]%',@var),1,'')
end
end
end
return cast(@num as numeric(12,3))
end

--测试
select dbo.GetNumbers('+')
select dbo.GetNumbers(',')
select dbo.GetNumbers('.')
select dbo.GetNumbers('-')
select dbo.GetNumbers('-123.2cbm')
select dbo.GetNumbers('+123.2cbm')
select dbo.GetNumbers('+123sas3.2cbm')
select dbo.GetNumbers('123sas3+.2cbm')
select dbo.GetNumbers('+123s-as3.+2cbm')


pt1314917 2008-09-09
  • 打赏
  • 举报
回复

+ 出错 0.000
, 出错 0.000
. 出错 0.000
- 出错 0.000
,, 出错 0.000
-123.2cbm 0.000 -123.200
+123.2cbm 0.000 123.200


create function GetNumbers(@var varchar(50))
returns numeric(12,3)
as
begin
declare @num varchar(50)
set @num=''
if(patindex('%[0-9]%',@var)=0)
set @num='0'
else
begin
while(patindex('%[0-9]%',@var)>0)
begin
set @num=@num+substring(@var,patindex('%[0-9.+-]%',@var),1)
set @var=stuff(@var,patindex('%[0-9.+-]%',@var),1,'')
end
end
return cast(@num as numeric(12,3))
end
go

--测试
select dbo.GetNumbers('+')
select dbo.GetNumbers(',')
select dbo.GetNumbers('.')
select dbo.GetNumbers('-')
select dbo.GetNumbers('-123.2cbm')
select dbo.GetNumbers('+123.2cbm')
select dbo.GetNumbers('+123sas3.2cbm')

tim_spac 2008-09-09
  • 打赏
  • 举报
回复
多个符号时是什么逻辑?
例如: "-fasd1343s-43" or "4ds+r46-as4" ..?
chenhao3947 2008-09-09
  • 打赏
  • 举报
回复
汗 ,补充下问题 ,上面是我写的一个函数,根据传入的字符串返回数字
但是碰到如下一些传入字符串时,会出错或者结果不正确,想请大家帮忙看看该怎么修改好或者重写。谢谢

传入字符 得到结果 希望得到结果
+ 出错 0.000
, 出错 0.000
. 出错 0.000
- 出错 0.000
,, 出错 0.000
-123.2cbm 0.000 -123.200
+123.2cbm 0.000 123.200
pt1314917 2008-09-09
  • 打赏
  • 举报
回复
虾米要求?

34,592

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧