【问题标题】:Wrong quotient during division double by string字符串除法双倍期间的商错误
【发布时间】:2014-02-22 08:07:55
【问题描述】:

早上好。我不想打扰你们,但我遇到了一个让我很困惑的问题。

我有一个 Excel 文件,其中有 2 列,我必须将 1 列除以另一列并将此结果插入 SQL 表中。

这是excel文件的快照,我在问题行下划线。

如果两列中的值都有“,”,就像其他行一样,那么一切都很好,但如果 1 有“,”而另一个没有,那么我得到错误的结果。 例如,编译器读取 147 像 147.0 {Double} 和 60,75 像 "60,75"{String}。如果一切正常,我应该得到结果 2,41,但我得到了 0,024(就像 60,75 转换为 6075)。不幸的是,我无法修改 Excel 文件。我怎样才能得到正确的结果?

除法代码如下:

            Dim usedRange = xlsWorkSheet.Range("E7", "F57")
            Dim usedRangeAs2DArray As Object(,) = usedRange.Value2
            Dim TeamIndex(), import As String
            ReDim TeamIndex(usedRange.Rows.Count)
            For i As Integer = 1 To usedRange.Rows.Count
             If (usedRangeAs2DArray(i, 1) = 0 And usedRangeAs2DArray(i, 2) = 0)
                Or usedRangeAs2DArray(i, 2) = 0 Then
                    z = 1
                    TeamIndex(i) = z
                Else
                    g = Convert.ToString(usedRangeAs2DArray(i, 1))
                    z = g / Convert.ToDouble(usedRangeAs2DArray(i, 2))
                    z = Math.Floor(100 * z) / 100
                    TeamIndex(i) = z
                End If
                Next

我尝试使用 Convert.ToString(),使用 Replace "."在第一列使用 "," 和 String.Format("{0:N2}", g),但这种方法被忽略了。

提前谢谢你。

【问题讨论】:

    标签: vb.net excel type-conversion division


    【解决方案1】:

    我想我发现不是很漂亮,但仍然可以解决这个问题。 如果我有整数值,没有“,”,编译器将其读取为类型 {Double},我的主要思想是简单地将“,00”字符串附加到该值。 这是我修改后的代码。

        Dim usedRange = xlsWorkSheet.Range("E7", "F57")
        Dim usedRangeAs2DArray As Object(,) = usedRange.Value2
        Dim TeamIndex(), import As String
        ReDim TeamIndex(usedRange.Rows.Count)
        For i As Integer = 1 To usedRange.Rows.Count
         If (usedRangeAs2DArray(i, 1) = 0 And usedRangeAs2DArray(i, 2) = 0)
            Or usedRangeAs2DArray(i, 2) = 0 Then
                z = 1
                TeamIndex(i) = z
            Else
                If TypeOf usedRangeAs2DArray(i, 1) Is System.Double Then
                    usedRangeAs2DArray(i, 1) = String.Concat(usedRangeAs2DArray(i, 1), ",00")
                End If
                If TypeOf usedRangeAs2DArray(i, 2) Is System.Double Then
                    usedRangeAs2DArray(i, 2) = String.Concat(usedRangeAs2DArray(i, 2), ",00")
                End If
                z = usedRangeAs2DArray(i, 1) / usedRangeAs2DArray(i, 2)
                z = Math.Floor(100 * z) / 100
                TeamIndex(i) = z
            End If
            Next
    

    更新: 找到更好的解决方案,将两个值都转换为 Double 并将“,”替换为“。”。

    下面是代码:

     Dim fDD, sDD As Double
    
                        If IsNumeric(usedRangeAs2DArray(i, 2)) And IsNumeric(usedRangeAs2DArray(i, 1)) Then
                            fDD = CDbl(usedRangeAs2DArray(i, 1).ToString().Replace(",", "."))
                           sDD = CDbl(usedRangeAs2DArray(i, 2).ToString().Replace(",", "."))
                        End If
    
                        z = fDD / sDD
                        z = Math.Floor(100 * z) / 100
                        TeamIndex(i) = z
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多