Получение массива из строки с числами

Ответить
Аватара пользователя
malev

Получение массива из строки с числами

Сообщение malev »

Есть строка следующего вида: "5-23,45,54,60-62" нужно создать массив из чисел от 5 до 23, 45, 54 и от 60 до 62. Т.е. аналог печати из Word, когда задаются диапазоны печати страниц. Признаюсь что я не силен в рег. выражениях, но чувствую что где то в них собака зарыта если кто быстро соображает помогите, пытаюсь сам одновременно разобраться. Нужно конечно еще и ошибки обрабатывать, должны быть только цифры, знаки "-" и "," а также при указании диапазона первая цифра меньше второй. (5-23 а не 23-5)
Аватара пользователя
Coutty

Re: Получение массива из строки с числами

Сообщение Coutty »

Я бы воспользовался таким алгоритмом:

1. Проверить строку на лишние символы и вырезать их.

2. Разбить строку по запятым StringSplit($str, ",")

3. Полученный массив обходим в цикле поэлементно и каждый элемент обрабатываем следующим образом:

3.1. Проверяем наличие дефиса в элементе.

3.2. Если дефиса нет, то просто копируем элемент в хранилище, скажем, $arr2.

3.3. Если дефис есть, то (предполагается, что пользователь не будет писать 5-20-40. Хотя можно потом и до такого расширять алгоритм):

3.4. Разбить строку по разделителю "дефис".

3.5. Проверить, чтобы 1 элемент был меньше второго.

3.6. В цикле от "1 элем" до "2 элем" создать последовательность чисел и записать в $arr2.
Аватара пользователя
malev

Re: Получение массива из строки с числами

Сообщение malev »

хмм тоже вариант, и кажется более мне понятный, попробую набросать и выложить, только с первым пунктом не согласен, пускай пишут правильно, возможно пользователь перепутал "," с "." и если я удалю точку то получится к примеру из "3.5" не 3 и 5, а 35, что неверно
Аватара пользователя
Creat0R

Re: Получение массива из строки с числами

Сообщение Creat0R »

Вот так по алгоритму Изображение:





Код:

Код: Выделить всё

#include 
$sVar = "5-23,45,54,60-62"
$aRange_Array = _GetRangeNumbersArray($sVar)
_ArrayDisplay($aRange_Array)
Func _GetRangeNumbersArray($sString, $sStr_Delim=",", $sRange_Delim="-")
    Local $aStr_Split = StringSplit($sString, $sStr_Delim)
    Local $aRetArr[1], $aRange_Split, $iFor, $iTo
    For $i = 1 To $aStr_Split[0]
        If StringInStr($aStr_Split[$i], $sRange_Delim) Then
            $aRange_Split = StringSplit($aStr_Split[$i], $sRange_Delim)
            $iFor = Number($aRange_Split[1])
            $iTo = Number($aRange_Split[$aRange_Split[0]])
            For $j = $iFor To $iTo ;От первого к последнему
                $aRetArr[0] += 1
                ReDim $aRetArr[$aRetArr[0]+1]
                $aRetArr[$aRetArr[0]] = $j
            Next
        Else
            $aRetArr[0] += 1
            ReDim $aRetArr[$aRetArr[0]+1]
            $aRetArr[$aRetArr[0]] = $aStr_Split[$i]
        EndIf
    Next
    Return $aRetArr
EndFunc

P.S

Не знаю почему, но у меня есть слабость к таким задачкам Изображение
Ответить

Вернуться в «AutoIt»