CDec没有返回正确的值

时间:2014-12-01 16:58:33

标签: vb.net

我创建的代码乘以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)

2 个答案:

答案 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”是意大利语,但来自/关于阿尔及利亚的数据可能是法国阿尔及利亚人。


像大多数传统的VB函数一样,

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()的调用。