22 Октябрь 2009

Извлечение чисел из строки

Строки |  Таги: ,

Извлечение чисел из строки.
В строке может быть несколько чисел (совсем не обязательно целых). Требуется извлечь их оттуда.
Решение для .net. К проекту добавляем модуль и в него помещаем код:

Friend Function Num_Array(ByVal Origin_str As String) As String()
        Dim Virt_array As String()
        Dim Virt_num As String = ""
        Dim Real_array As String()
        Dim Real_num As String = ""
        Dim i As Integer
        Dim separator() As String = {" "}
        Dim CharsArray() As System.Char = Origin_str.ToCharArray 'разбиваем строку на массив символов
        Dim Split_opt As StringSplitOptions = StringSplitOptions.RemoveEmptyEntries
        For i = 0 To CharsArray.Length - 1
            If (IsNumeric(CharsArray.GetValue(i).ToString) = True) Or (CharsArray.GetValue(i).ToString.Equals(DecimalSeparator) = True And Virt_num.Length > 0) Then
                Virt_num = Virt_num & CharsArray.GetValue(i).ToString
            Else
                Virt_num = Virt_num & " "
            End If
        Next
        Virt_array = Virt_num.Split(separator, Split_opt)
        'в конце и начале любого элемента массива возможно наличие десятичного разделителя. Удаляем разелители из начала и окончания элементов.
        For i = 0 To Virt_array.Length - 1
            If Virt_array.GetValue(i).ToString.EndsWith(DecimalSeparator) Then
                Virt_array.SetValue(Virt_array.GetValue(i).ToString.Remove(Virt_array.GetValue(i).ToString.Length - 1, 1), i)
            End If
            If Virt_array.GetValue(i).ToString.StartsWith(DecimalSeparator) Then
                Virt_array.SetValue(Virt_array.GetValue(i).ToString.Remove(0, 1), i)
            End If
            'Ну и наконец, формируем окончательный массив, в котором содержатся ТОЛЬКО те строки, которые могут быть интерпретированы как числа.
            If IsNumeric(Virt_array.GetValue(i).ToString) = True Then
                Real_num = Real_num & " " & Virt_array.GetValue(i).ToString
            End If
        Next
        Real_array = Real_num.Split(separator, Split_opt)
        Return Real_array
    End Function

    Private Function DecimalSeparator() As String
        Dim ts As String
        ts = "1.2"
        If IsNumeric(ts) = True Then
            Return ts.Chars(1)
        Else
            ts = "1,2"
            Return ts.Chars(1)
        End If
    End Function

Имеем 2 функции:
DecimalSeparator — функция возвращает строку — символ десятичного разделителя в системе (точка или запятая). Функция вспомогательная и вне модуля не используется. Однако можно сделать ее Friend и использовать в проекте при необходимости.
Num_Array(ByVal Origin_str As String) — собственно, рабочая лошадка. Получает в качестве исходных данных строку, из которой надо извлечь числа. Возвращает набор чисел в виде одномерного массива строк. Числа, в принципе, могут быть с любым количеством знаков после запятой и до нее, т.к. фактически они представлены в виде строк.
Внимание: функция игнорирует набор символов вида «12,12,12″, т.к. невозможно однозначно установить расположение запятой-элемента строки и запятой-разделителя. Аналогичная ситуация с точками, если разделитель в системе — точка.



Оставить комментарий

Я не робот.