2014-01-30 4 views
0

Доброе утро. Я не хочу беспокоить вас, ребята, но я столкнулся с проблемой, которая меня действительно задевала.Неправильный коэффициент во время разделения двойной строкой

У меня есть файл Excel, в котором у меня есть 2 столбца, где я должен делить 1 столбец на другой и вставлять этот результат в таблицу SQL.

Вот снимок файла excel, где я подчеркиваю строку проблемы.

enter image description here

Если значения в обоих столбцах есть «» как и в других рядах, то все нормально, но если 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(), используйте Заменить "" с "," и String.Format ("{0: N2}", g) в первом столбце, но это просто игнорируется.

Заранее спасибо.

ответ

0

Я думаю, я нашел не очень красивое, но тем не менее рабочее решение этой проблемы. Основная идея, если у меня есть целочисленное значение, без «,», которое считывается компилятором как type {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 

UPDATE: Найдено лучшее решение, преобразовать оба значения в 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 
Смежные вопросы