Vb.net 是否可以更改float.ToString()中的默认小数分隔符?

Vb.net 是否可以更改float.ToString()中的默认小数分隔符?,vb.net,Vb.net,我需要将字符串格式的数据发送到mysql。默认情况下,vb.net将0.5解释为MySql不接受的0.5。我知道我可以编写floatval.tostring.replace(“,”,“”)使其适合,但我想知道是否有可能使它更舒适,这样从float到string的隐式转换将产生一个点而不是逗号 编辑:每个请求,当前代码 Public Sub InsertInto(Values As IEnumerable(Of String)) Dim ValStr As String = ""

我需要将字符串格式的数据发送到mysql。默认情况下,vb.net将0.5解释为MySql不接受的0.5。我知道我可以编写floatval.tostring.replace(“,”,“”)使其适合,但我想知道是否有可能使它更舒适,这样从float到string的隐式转换将产生一个点而不是逗号

编辑:每个请求,当前代码

Public Sub InsertInto(Values As IEnumerable(Of String))
    Dim ValStr As String = ""
    For Each V In Values
        ValStr &= "'" & V & "',"
    Next
    Dim Command = New MySqlCommand("INSERT INTO " & Table & " VALUES (" & ValStr.Substring(0, ValStr.Length - 1) & ");", Connection)
    Command.ExecuteNonQuery()
End Sub
此方法是mysql连接包装器的一部分,属性“connection”和“Table”是预先指定的

我的测试代码调用该函数,如下所示:

dimdum.InsertInto({"DEFAULT", (0.5).ToString.Replace(",", "."), "here is text"})
测试表列自动迭代int作为主键,一个float和一个varchar指定CultureInfo:

Dim n As Single
Dim s As String
n = Math.PI
s = n.ToString("F2", New System.Globalization.CultureInfo("en-US"))
s将为“3.14”,即使您的计算机设置为不同的格式。

指定文化信息:

Dim n As Single
Dim s As String
n = Math.PI
s = n.ToString("F2", New System.Globalization.CultureInfo("en-US"))

s将是“3.14”,即使您的计算机设置为不同的格式。

正如我在上面的评论中所说,恐怕您需要修改很多代码。正如您有很多问题一样,最糟糕的是Sql注入,您迟早要修复它,但是您尝试转换字符串中的所有内容也有一个缺点,即小数、日期和其他浮点值的转换比Sql注入带来更多的直接问题

只有一种方法可以退出,那就是使用参数化查询。需要编写更多的代码,但过了一段时间,它就非常简单了

例如,您应该将代码重写为如下内容

Public Sub InsertInto(sqlText As String, Values As List(Of MySqlParameter))
    Using Connection = New MySqlConnection(... connectionstring here (or a global variable ....)
        Using Command = New MySqlCommand(sqlText, Connection)
            Connection.Open()
            If Values IsNot Nothing Then
                Command.Parameters.AddRange(values.ToArray)
            End If
            Command.ExecuteNonQuery()
        End Using
    End Using 
End Sub
用这个来称呼它

Dim decValue As Decimal = 0.5
Dim strValue As String = "Test"
Dim dateValue As DateTime = DateTime.Today

Dim parameters = New List(Of MySqlParameter)()
parameters.Add(New MySqlParameter() With { .ParameterName = "@p1", 
                                           .DbType = MySqlDbType.Decimal,
                                           .Value = decValue})
parameters.Add(New MySqlParameter() With {.ParameterName = "@p2",
                                          .DbType = MySqlDbType.String,
                                          .Value = strValue})
parameters.Add(New MySqlParameter() With {.ParameterName = "@p3",
                                         .DbType = MySqlDbType.Date,
                                         .Value = dateValue})

InsertInto("INSERT INTO youTable VALUES(@p1, @p2, @p3)", parameters)
请注意,现在的
InserInto
只是一个简单的例程,它接收命令文本和文本所需的参数,将它们添加到命令中,打开连接,执行所有操作,然后关闭连接退出

还要注意,对于参数化查询,sql命令完全没有字符串单引号、日期格式规则和小数点处理所造成的混乱


A side note。此插入文本假设您的表正好有三个字段,并且您提供了所有字段的值,如果您只想插入字段的子集,则需要将它们作为第三个参数传递给方法)

,正如我在上面的注释中所说,恐怕您需要修改很多代码。正如您有很多问题一样,最糟糕的是Sql注入,您迟早要修复它,但是您尝试转换字符串中的所有内容也有一个缺点,即小数、日期和其他浮点值的转换比Sql注入带来更多的直接问题

只有一种方法可以退出,那就是使用参数化查询。需要编写更多的代码,但过了一段时间,它就非常简单了

例如,您应该将代码重写为如下内容

Public Sub InsertInto(sqlText As String, Values As List(Of MySqlParameter))
    Using Connection = New MySqlConnection(... connectionstring here (or a global variable ....)
        Using Command = New MySqlCommand(sqlText, Connection)
            Connection.Open()
            If Values IsNot Nothing Then
                Command.Parameters.AddRange(values.ToArray)
            End If
            Command.ExecuteNonQuery()
        End Using
    End Using 
End Sub
用这个来称呼它

Dim decValue As Decimal = 0.5
Dim strValue As String = "Test"
Dim dateValue As DateTime = DateTime.Today

Dim parameters = New List(Of MySqlParameter)()
parameters.Add(New MySqlParameter() With { .ParameterName = "@p1", 
                                           .DbType = MySqlDbType.Decimal,
                                           .Value = decValue})
parameters.Add(New MySqlParameter() With {.ParameterName = "@p2",
                                          .DbType = MySqlDbType.String,
                                          .Value = strValue})
parameters.Add(New MySqlParameter() With {.ParameterName = "@p3",
                                         .DbType = MySqlDbType.Date,
                                         .Value = dateValue})

InsertInto("INSERT INTO youTable VALUES(@p1, @p2, @p3)", parameters)
请注意,现在的
InserInto
只是一个简单的例程,它接收命令文本和文本所需的参数,将它们添加到命令中,打开连接,执行所有操作,然后关闭连接退出

还要注意,对于参数化查询,sql命令完全没有字符串单引号、日期格式规则和小数点处理所造成的混乱


A side note。这个INSERT-INTO-text假设您的表正好有三个字段,并且您提供了所有字段的值,如果您只想插入字段的子集,那么您需要将它们作为第三个参数传递给该方法)

我不敢说,但是您的处境非常糟糕。您不应该这样编写sql命令。Sql的特性Injection@Steve是的,我知道安全问题,我曾计划为任何用户输入创建一个过滤器,但您是否建议有更好的方法?是的,参数化查询是正确的方法。请您阅读以下内容:您“意识到安全问题”,但您还是照办了?令人担忧。我不敢说,但你的处境非常可怕。您不应该这样编写sql命令。Sql的特性Injection@Steve是的,我知道安全问题,我曾计划为任何用户输入创建一个过滤器,但您是否建议有更好的方法?是的,参数化查询是正确的方法。请您阅读以下内容:您“意识到安全问题”,但您还是照办了?令人担忧。我认为这个答案不值得-1。问题是:“是否可以更改float.ToString()中的默认小数分隔符?”。这里你有一个有效(足够)的答案。如果在这个特定的背景下,有更好的方法来处理潜在的情况,它将被进一步投票(理想情况下,罗恩应该提到参数化)。在任何情况下,这一条都解决了OP最初关注的问题(如问题中所强调的),因此是值得的。对于希望了解如何在SQL之外更改默认小数分隔符的未来读者非常有用。@varocabas谢谢。我经常处理系统之间的数据交换。它通常通过串行端口或网络连接。标点符号必须在远端解析,客户控制系统设置,参数化查询不是选项。我认为这个答案不值得-1。问题是:“是否可以更改float.ToString()中的默认小数分隔符?”。这里你有一个有效(足够)的答案。如果在这个特定的背景下,有更好的方法来处理潜在的情况,它将被进一步投票(理想情况下,罗恩应该提到参数化)。在任何情况下,这一条都解决了OP最初关注的问题(如问题中所强调的),因此是值得的。对于希望了解如何更改默认小数的未来读者非常有用