Форум » [x]Harbour » [?] Строку в массив (Разминка перед новым годом) » Ответить

[?] Строку в массив (Разминка перед новым годом)

Dima: Есть строка вида 1,2,456,77 Или 1c2_456(77 Разделитель между цифрами может быть любой (кроме цифры разумеется) Надо преобразовать строку в числовой массив вида {1,2,456,77} Есть идеи ? PS Решение я уже знаю , хочется посмотреть и другие подходы.

Ответов - 11

Andrey: aDim := HB_ATokens(cStr,",",.F.,.F.)

Dima: Andrey пишет: aDim := HB_ATokens(cStr,",",.F.,.F.) Неа не верно. Проверь на строке 1c2_456(77

Andrey: Dima пишет: Неа не верно. Проверь на строке 1c2_456(77 Сделай перед этим FOR nI := 1 TO 255 IF nI <=48 .OR. nI > 59 ELSE STRTRAN(cStr,CHR(nI),";") ENDIF NEXT STRTRAN(cStr,":",";")


Haz: Andrey пишет: Сделай перед этим FOR nI := 1 TO 255 так не годится - так из строки "1xxx2zzz3...4" в массиве будет {1,,,,2,,,,3,,,,4} а надо {1,2,3,4}

Vlad69: aNumbers := hb_RegexSplit("[^0-9]+",cTestString)

Vlad69: или "\D" вместо "[^0-9]" )))

Haz: Vlad69 пишет: aNumbers := hb_RegexSplit("[^0-9]+",cTestString) в точку это самый короткий и правильно работающий код

Dima: Haz пишет: в точку Да , так и есть !

Dima: Vlad69 пишет: или "\D" вместо "[^0-9]" ))) Все красиво пока нет пробелов На такой строке c:="1c 2_456(77 " вернет {"1", "", "2", "456", "77","",""} наверное это косяк Harbour , так как маска "[^0-9]" означает любой не цифровой символ а за пробел разрабы забыли :) Поэтому сделать можно так [pre2] Func strtoArrayn(c) local ams:=hb_regexSplit( '\D', c ) local ret:={} if len(ams)#0 aeval(ams,{|x| iif(!empty(x), aadd(ret,val(x)),"") }) endif return ret [/pre2]

Vlad69: Пробелы в середине убираются через "\D+", хвостовые - тривиальным Alltrim )))

Dima: Vlad69 Понятно. Спасибо. Оставлю пожалуй код без изменений :)



полная версия страницы