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

时间:2015-09-04 20:46:12

标签: vb.net

我需要以字符串格式向mysql发送数据。默认情况下,vb.net将0.5解释为0,5,MySql不会接受。我知道我可以编写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"的一部分。和"表"是预先分配的。

我的测试代码调用函数如下:

dimdum.InsertInto({"DEFAULT", (0.5).ToString.Replace(",", "."), "here is text"})

测试表列是自动迭代int作为主键,float和varchar

2 个答案:

答案 0 :(得分:3)

正如我在上面的评论中所说,我担心你需要修改很多代码。因为你有很多问题,最糟糕的是Sql Injection迟早你需要修复,但你尝试转换字符串中的所有东西也有缺点,即小数,日期和其他浮点值的转换给出比Sql Injection更麻烦。

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

例如,您应该将代码重写为类似

的代码
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命令完全没有由字符串的单引号引起的混乱,日期的格式规则和小数点的处理无处可见

附注。这个INSERT INTO文本假设您的表中只有三个字段,并且您提供了所有字段的值,如果您只想插入一部分字段,那么您需要将它们作为第三个参数传递给方法)

答案 1 :(得分:1)

指定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”,即使您的计算机设置为不同的格式。