当前位置: 首页 > 面试题库 >

将带表达式的字符串转换为十进制

魏明亮
2023-03-14
问题内容

我有一个表,该表的列为’Faktor’(varchar(50)),其中包含以下表达式:

1/3
2*9/5
0.567
0.23

不,我正在寻找一种执行选择的方式

select Faktor from Artikel

它应该返回带有值的十进制类型的列

0.333333
3.6
0.567
0.23

问题答案:

我会选择CLR,类似这样(它具有在基于SET的操作中工作的优势,而动态sql替代项(即Abduls答案)则不会):

编辑: CLR dll(Visual Studio
2008)的源代码发布在这里:http
:
//www.heavencore.co.uk/filehub/uploaded/EvalFunction.zip


如果您希望自己编译程序集,请使用以下代码:

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Runtime.InteropServices

Partial Public Class UserDefinedFunctions
    <Microsoft.SqlServer.Server.SqlFunction()> _
    Public Shared Function EVAL(ByVal InputExpression As SqlString) As SqlDecimal
        Return Evaluate(InputExpression)
    End Function

    Private Shared Function Evaluate(ByVal expression As SqlString) As SqlDecimal
        Dim expressionStr As String = expression.ToString()
        Dim loDataTable = New DataTable()
        Dim loDataColumn = New DataColumn("Eval", GetType(Double), expressionStr)
        loDataTable.Columns.Add(loDataColumn)
        loDataTable.Rows.Add(0)
        Return ParseDecimal(loDataTable.Rows(0)("Eval").ToString(), 0)
    End Function

    Public Shared Function ParseDecimal(ByVal InputStr As String, Optional ByVal ReturnIfFail As Decimal = 0) As Decimal
        Dim ParseOutput As Decimal = 0
        If Decimal.TryParse(InputStr, ParseOutput) = False Then
            Return ReturnIfFail
        Else
            Return ParseOutput
        End If
    End Function
End Class

安装并绑定后,您可以执行以下操作:

SELECT Faktor, dbo.Eval(Faktor) as Result FROM Artikel

编辑:好的,我刚刚测试过,它在基于集合的操作等中工作正常,安装如下:

-- Enable the CLR to run user-defined functions
EXEC sp_configure 
    'clr enabled' ,
    '1'
GO
RECONFIGURE
GO

-- Set the appropriate database security permission
ALTER DATABASE [TargetDatabase] SET TRUSTWORTHY ON
GO

-- Import the assembly
CREATE ASSEMBLY EvalFunction
FROM 'C:\bin\EvalFunction.dll'  
WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO

-- Create the Eval function for easy use
CREATE FUNCTION dbo.Eval
    (
      @Expression NVARCHAR(255)
    )
RETURNS DECIMAL(18, 2)
AS EXTERNAL NAME 
    EvalFunction.[EvalFunction.UserDefinedFunctions].EVAL 
GO


 类似资料:
  • 问题内容: 要将String转换为十六进制,我正在使用: 在此处投票最高的答案中对此进行了概述:在Java中将 字符串转换为十六进制 我该如何反向执行,即将十六进制转换为字符串? 问题答案: 您可以从转换后的字符串中进行重构,这是一种实现方法: 另一种方法是使用,从包: 单元测试以验证: 注:领先剥离的仅仅是必要的,因为的你的填充方法。如果您不介意将其替换为简单的,则可以将此行放在:

  • 问题内容: 我想将十六进制字符串转换为二进制字符串。例如,十六进制2是0010。下面是代码: 但是,这仅适用于十六进制0-9;它不适用于十六进制A-F,因为它使用。谁能增强它? 问题答案: 您需要告诉Java int是十六进制的,如下所示:

  • 问题内容: 我编写了一个简单的程序,用于在Java中向串行端口发送和接收数据。我通过回送测试(Rx到Tx)连接串行端口设备。它工作正常。但我无法发送和接收十六进制数据到串行端口和接收串行端口。在我的设备中使用了FT232BL芯片,因此是否需要任何dll或其他库来将十六进制数据发送和接收到串行端口设备。我的代码如下。 问题答案: 十六进制: 十六进制为:

  • 问题内容: 我正在尝试将十六进制代码长8个字符的字符串转换为整数,以便可以进行int比较,而不是对许多不同值进行字符串比较。 我知道在C ++中这是微不足道的,但是我需要在Java中完成。我需要满足的测试用例实质上是将“ AA0F245C”转换为int,然后再返回到该字符串,以便我知道它在正确转换。 我尝试了以下方法: 我也尝试一次将两个字符做一次,然后将结果相乘,转换有效,但数字不正确。 不能这

  • 关于将带浮点数的字符串转换为十进制浮点数的方法有很多讨论,但我没有找到用C语言解决问题的方法(python、C#等) 首先,我们输入初始数的数字系统,并将浮点数输入字符串变量。 然后将输入分成右(double)部分和左(int)部分,然后为这两部分调用函数void floatToDec(字符串输入,int sys,char标志)(标志“l”表示左部分标志“r”meens right part)。为

  • 问题内容: 我写了一些代码将十六进制显示字符串转换为十进制整数。但是,当输入类似100a或625b(带有字母的东西)时,我得到了这样的错误: java.lang.NumberFormatException:对于输入字符串:java.lang.Integer.parseInt(未知源)处的java.lang.NumberFormatException.forInputString(未知源)处为“ 1