即 能把 5*4^2/3
转换成5*power(4,2)/3

解决方案 »

  1.   

    是的。乘方的优先级应是高于*/的。即能把字符串: X0*X1^X2/X3
    转换成字符串: X05*power(X1,X2)/X3
    前后的运算是加减乘除都无所谓。
    输入输出都是varchar百谢
      

  2.   


    格式固定可以这样declare @var varchar(100)set @var='5*4^2/3'select left(@var,PATINDEX('%*%',@var))+'power('+right(left(@var,PATINDEX('%^%',@var)-1),PATINDEX('%^%',@var)-PATINDEX('%*%',@var)-1)+','+right(left(@var,PATINDEX('%/%',@var)-1),PATINDEX('%/%',@var)-PATINDEX('%^%',@var)-1)+')'+right(@var,len(@var)-PATINDEX('%/%',@var)+1)
    ----------------------
    5*power(4,2)/3(1 行受影响)
      

  3.   

    谢谢ldslove:格式不固定啊。不过谢谢你给的例子,我有了点思路。------------------
    夜了,明早再斗。
      

  4.   

    create function f_power(@s varchar(100))
    returns varchar(100)
    as
    begin
    declare @s1 varchar(50),@s2 varchar(50)
    select
      @s1= left(@s,charindex('^',@s)-1),
      @s2= right(@s,charindex('^',reverse(@s))-1)
    select
      @s1=stuff(@s1,len(@s1)-patindex('%[^0-9]%',reverse(@s1))+2,0,'power('),
      @s2=stuff(@s2,patindex('%[^0-9]%',@s2),0,')')
    return @s1+','+@s2
    end
    goselect dbo.f_power('5*4^2/3')
    /**-------------------------------
    5*power(4,2)/3(1 行受影响)
    **/drop function f_power
    只适合只有一个^的表达式
      

  5.   

    啊,结贴给分漏了dawugui,抱歉。
      

  6.   

    再次修改。支持多个'^',修正了一个小bug。alter function f_power(@s varchar(100))
    returns varchar(100)
    as
    begin
      
      declare @Idx1 int, @idx0 int, @Idx2 int
      declare @s1 varchar(50), @s2 varchar(50)
      declare @ss1 varchar(50), @ss2 varchar(50)  select 
        @Idx1 = Charindex('^', @s)
      if @Idx1 = 0
        return @s  select
        @s1 = left(@s,@Idx1-1),
        @s2 = right(@s,Len(@s)-@Idx1)  select
        @Idx0 = Patindex('%[^0-9a-z]%',Reverse(@s1)),
        @Idx2 = Patindex('%[^0-9a-z]%',@s2)  if @Idx0=0
        select @ss1=@s1
      else
        select @ss1=Right(@s1, @Idx0-1)  if @Idx2=0
        select @ss2=@s2
      else
        select @ss2=Left(@s2, @Idx2-1)  select   
        @s=Replace(@s, @ss1+'^'+@ss2, 'Power('+@ss1+','+@ss2+')')  select 
        @s=dbo.f_power(@s)  return @s
    end===================================================================
    print dbo.f_power('X1^2+x2^2')-------------------------------------------------------------------
    Power(X1,2)+Power(x2,2)