我创建的代码乘以DatagridView列的所有值。代码正在运行,但是有问题。特别是,我添加了这个:
Return CDec(x.Cells("Quote").Value.ToString.Replace(",", "."))
这会返回分割值,例如,如果我有:
2,7返回的正确值是:2.7,但代码返回27,这很奇怪。我做了一些尝试,如果我删除了CDec,如:
Return x.Cells("Quote").Value.ToString.Replace(",", ".")
返回的值是正确的,但我与此函数形成对比:
Private Function MultiplyDecimals(ByVal sender As Decimal()) As Decimal
Dim Result As Decimal
If Not sender Is Nothing AndAlso Not sender.Length = 0 Then
Result = sender.Aggregate(Function(a, b) a * b)
End If
Return Result
End Function
如果我删除“As Decimal”,则返回0。那有什么不对?
更新可能的解决方案:
Dim bles = x.Cells("Quote").Value.ToString.Replace(",", ".")
Dim key = Convert.ToDecimal(bles)
MessageBox.Show(key)
Return CDec(key)
答案 0 :(得分:1)
由于看起来像,你也试图从不同的文化手动转换,你应该使用.NET方法,而不是自己动手。您有两次转换:从一个文化号码系统到另一个,从字符串到数字类型。
转换字符串“2,7”,其中可能是法语或意大利语值:
Dim str As String = "2,7"
Dim decVal As Decimal
If Decimal.TryParse(str, NumberStyles.AllowDecimalPoint,
New CultureInfo("it-IT"), decVal) Then
' decVal has the value
Else
' Parse failed
End If
或:
Dim cult As New CultureInfo("fr-FR")
If Decimal.TryParse(str, NumberStyles.AllowDecimalPoint,
cult, decVal) Then ...
这通常可行,但根据内容可能会出现例外情况:
Dim decVal As Decimal
Dim cult As New CultureInfo("fr-FR")
decVal = Convert.ToDecimal(str, cult)
Console.WriteLine(decVal.ToString)
注意:我猜测数据的文化。基于您的recent, related question谷歌表示“Nazione”是意大利语,但来自/关于阿尔及利亚的数据可能是法国阿尔及利亚人。
CDec
只能用于处理活动文化设置。因此,在某些情况下,它似乎会被“破坏”:
Console.WriteLine(CDec("2.7")) ' --> 2.7D US/Can
Console.WriteLine(CDec("2,7")) ' --> 27D
Console.WriteLine(CDec("2,,7")) ' --> 27D
在使用法国或意大利文化的机器上,相反的情况将会发生:“2.7”将出现27,“2,7”到2.7D,但“2,,7”可能会崩溃,就像“2 .. 7“会在美国/可以。
这种行为的原因是在US / Can中,逗号看起来像噪音而CDec
忽略它。具有单个小数点的字符串将转换,但具有2的字符串无效。对于使用逗号的法语,它将是相反的:任何数量的点看起来像噪声,只有单个十进制逗号格式将被解析。
这是解决方案中没有人包含CDec
的原因之一:它对于任何类型的文化转换都是次优的。手动删除或替换小数标记甚至 less 是最优的,只有在需要时才设计这样做的方法。
答案 1 :(得分:0)
由于您有字符串值,请尝试Decimal.Parse()
而不是CDec()。
如果这没有给出您期望的结果,那么要么您没有处理您认为自己的字符串(在这种情况下,请尝试将确切的字符串记录到文本文件或类似文件中,以便您可以准确地看到你有什么),或PC的文化设置不是你认为的(它可能被设置为使用逗号的文化,而不是句号,作为小数分隔符),在这种情况下尝试其中一个十进制。 Parse()重载允许您指定文化,或者甚至只是删除对.Replace()
的调用。