Что нового

Получить географические координаты из инпута

Зундер

Новичок
Сообщения
4
Репутация
0
Есть необходимость читать значение инпута и интерпретировать его в зависимости от введенных данных.
Вводятся географические координаты, могут быть представлены 3 способами.
1.
50 градусов 15 минут 15 секунд
30 градусов 45 минут 50 секунд
2.
50 градусов 15.2500 минут
30 градусов 45.8333 минут
3.
50.254167 градусов
30.763889 градусов
Это всё одна точка, просто различное представление. В итоге необходимо свести к третьему варианту записи.

Как пересчитать я знаю, я не знаю как ввести ограничение вводимого значения (меньше 60 минут, меньше 60 секунд) и как обрабатывать значение с пробелом. например, в 50 15 15 выделить 50 градусов, поставить точку + "минуты" /60 + "секунды"/3600

По идее можно регулярным выражением это сделать? Или есть способ выделить значение после пробела? Очень много времени потратил, ни к чему не пришел. :(
Буду благодарен любой помощи.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
While 1
	$file = InputBox('', '')
		Switch @error
			Case 1 To 5
				Exit 1111
		EndSwitch
	Select
		Case StringInStr($file,'минут') And StringInStr($file,'секунд')
			$str=StringRegExp($file,'\d+',3)
			Select
				Case $str[0]>59
					MsgBox(32,'','градусы больше чем надо')
					ContinueLoop
				Case $str[1]>59
					MsgBox(32,'','минуты больше чем надо')
					ContinueLoop
				Case $str[2]>59
					MsgBox(32,'','секунды больше чем надо')
					ContinueLoop
			EndSelect

		MsgBox(32,'',Execute($str[0]&'+'&($str[1]/60)&'+'&Round($str[2]/3600,7)))
		ExitLoop
	Case StringInStr($file,'минут')
		$str=StringRegExp($file,'[0-9.]+',3)
		Select
				Case $str[0]>59
					MsgBox(32,'','градусы больше чем надо')
					ContinueLoop
				Case $str[1]>59
					MsgBox(32,'','минуты больше чем надо')
					ContinueLoop
			EndSelect

		MsgBox(32,'',Execute($str[0]&'+'&Round($str[1]/60,7)))
		ExitLoop
	Case Else
		MsgBox(32,'',$file)
		ExitLoop
EndSelect

WEnd
 
A

Alofa

Гость
Еще пара вариантов:
Код:
#include <Array.au3>
Local $asCoord[6] = ['50 градусов 15 минут 15 секунд', _
					'30 градусов 45 минут 50 секунд', _
					'50 градусов 15.2500 минут', _
					'30 градусов 45.8333 минут', _ ;> Изначально округленное число 45.833333333334 => получаем на выходе погрешность
					'50.254167 градусов', _
					'30.763889 градусов']
		
_Variant_1($asCoord) ; Вариант 1
_Variant_2($asCoord) ; Вариант 2

Func _Variant_1($asCoord)
	For $i=0 To 5
		$asCoord[$i] = StringReplace($asCoord[$i], 'градусов', '+')
		$asCoord[$i] = StringReplace($asCoord[$i], 'минут', '/60+')
		$asCoord[$i] = StringReplace($asCoord[$i], 'секунд', '/3600+')
		$asCoord[$i] = Round(Execute($asCoord[$i] & '0'), 6)
	Next
	_ArrayDisplay($asCoord, 'Вариант 1')
EndFunc

Func _Variant_2($asCoord)
	For $i = 0 To 5
		$asNum = StringRegExp($asCoord[$i], '([\d.]+)', 3)
		$asCoord[$i] = Round(Number($asNum[0] + ((UBound($asNum) > 1) ? $asNum[1] / 60 : 0) + ((UBound($asNum) = 3) ? $asNum[2] / 3600 : 0)), 6)
	Next
	_ArrayDisplay($asCoord, 'Вариант 2')
EndFunc
 
Автор
З

Зундер

Новичок
Сообщения
4
Репутация
0
Alofa, применил второй вариант. Спасибо!!!
Не подскажете, как запретить пользователю вводить больше групп символов? Например, 20 30 34.234 1234?
 
A

Alofa

Гость
Зундер сказал(а):
Вводятся географические координаты, могут быть представлены 3 способами.
Зундер сказал(а):
как обрабатывать значение с пробелом. например, в 50 15 15 выделить 50 градусов, поставить точку + "минуты" /60 + "секунды"/3600
Т.е. есть еще и четвертый способ?

Зундер сказал(а):
Не подскажете, как запретить пользователю вводить больше групп символов? Например, 20 30 34.234 1234?
Это вообще все происходит в GUI, которое вы создали?


Добавлено:
Сообщение автоматически объединено:

Код:
#include <Array.au3>
Local $asCoord[6] = ['50 градусов 15 минут 15 секунд', _
					'30 градусов 45 минут 50 секунд', _
					'50.254167 градусов', _
					'30 45 50', _
					'50 15 15 1234', _
					'30 45 50.234 6634']
					
_Variant_2_1($asCoord) ; Учитываются только три первых блока цифр
_Variant_2_2($asCoord) ; Учитываются только три первых блока цифр (3-й блок обрезается до точки)

Func _Variant_2_1($asCoord)
	For $i = 0 To 5
		$asNum = StringRegExp($asCoord[$i], '([\d.]+)', 3)
		$asCoord[$i] = Round(Number($asNum[0] + ((UBound($asNum) > 1) ? $asNum[1] / 60 : 0) + ((UBound($asNum) > 2) ? $asNum[2] / 3600 : 0)), 6)
	Next
	_ArrayDisplay($asCoord, 'Вариант 2.1')
EndFunc

Func _Variant_2_2($asCoord)
	For $i = 0 To 5
		$asNum = StringRegExp($asCoord[$i], '([\d.]+)', 3)
		$asCoord[$i] = Round(Number($asNum[0] + ((UBound($asNum) > 1) ? $asNum[1] / 60 : 0) + _
						((UBound($asNum) > 2) ? StringRegExpReplace($asNum[2], '(\d+)\.?.*', '$1') / 3600 : 0)), 6)
	Next
	_ArrayDisplay($asCoord, 'Вариант 2.2')
EndFunc
 
Автор
З

Зундер

Новичок
Сообщения
4
Репутация
0
Спасибо! Мысль понятна, просто торможу уже. :smile: И, если честно, надеялся на неизвестную мне магию. :beer:
Alofa сказал(а):
Т.е. есть еще и четвертый способ?
Нет, конечно, но Я вполне представляю, на что способны пользователи, потом меня же и обвинят, что программа позволяет так вводить :rofl: Я их даже поименно знаю. :laugh:
 
Верх