Ответ на этот вопрос был дан внизу этого поста.
Я просмотрел 6 разных веб-страниц с форумов AHK, задающих этот вопрос, и еще одну на SO здесь:
Строка в номер с помощью autohotkey
... но ни один из них не работает для меня. Я просто пытаюсь вычесть число из строки, полученной функцией StringSplit. Это мой код:
; Assign entry price variable.
StringSplit, prices, Window1Text, `n
MsgBox, Your entry price is %prices32%.
; Assign Stop Loss variable
SLPrice := %prices32% -= 0.10
MsgBox, Your SLPrice is %SLPrice%.
Я получаю сообщение об ошибке «Следующее имя переменной содержит недопустимый символ» в строке «SLPrice := %prices32% -= 0,10», поэтому я пытаюсь:
; Assign entry price variable.
StringSplit, prices, Window1Text, `n
MsgBox, Your entry price is %prices32%.
; Assign Stop Loss variable
SLPrice = %prices32% - 0.10
MsgBox, Your SLPrice is %SLPrice%.
... на что я получаю вывод:
Your SLPrice is 7.450 - 0.10
Таким образом, он просто отображает формулу в виде текстовой строки, фактически не выполняя вычислений.
Мысли? Спасибо!
ОБНОВИТЬ Чтобы продолжить разработку этого решения, вот мой полный код до той части, с которой у меня возникла проблема, а также скриншоты того, что происходит:
; Get the latest window text to parse values from it
WinGetText, Window1Text, ahk_class WindowsForms10.Window.8.app.0.f96fc5_r9_ad1
MsgBox, The text is: %Window1Text% ; Displays the window get text values
Sleep, 5
; Assign entry price variable.
StringSplit, prices, Window1Text, `n
MsgBox, Your entry price is %prices32%.
; Assign Stop Loss variable
SLPrice := prices32 - 0.10
MsgBox, Your SLPrice is %SLPrice%.
ОТВЕЧАТЬ Благодаря нижеуказанному участнику мы обнаружили, что существует "." из первого MsgBox испортил переменную SLPrice, поэтому мы обновили переменную SLPrice, чтобы она читалась так:
SLPrice := SubStr(Trim(prices32), 1, 5) - 0.10 ; to pull the left 5 characters
Спасибо!
должно, но не так, как у вас. Это SLPrice := prices32 - 0.10
, потому что оператор :=
предполагает выражения! Подробности смотрите в моем ответе.
@PGilm Смотрите мой комментарий ниже. Я думаю, что мы близки, но теперь второй msgbox на самом деле не отображает номер?
Да, в моем исходном сообщении были опечатки в переменной (поскольку я изменил ее, чтобы она подходила для собственного теста). Затем я отредактировал ответ (несколько раз), чтобы уточнить, и когда я заметил эту ошибку (я использовал prices2
). Поэтому я добавил наглядный пример после вашего комментария. Что ж, тогда я заинтересовался его более общим использованием с псевдомассивом, который вы создали из Window1Text
, и добавил версию с полем ввода и выражение переменной псевдомассива, потому что именно поэтому в AHK есть псевдомассивы!
@PGilm Я очень ценю ваш вклад, но что-то с моей стороны все еще не работает с вашими обновленными ответами. Я обновил свой вопрос выше, включив в него полный код и скриншоты того, что показывает мне MsgBox. Ваш пример работает, когда вы передаете ему массив так, как у вас есть, но когда я пытаюсь обновить его, чтобы использовать мои данные из SplitString, он не работает :( Я использую AHK 1.1.30.03. Есть еще мысли? ИЛИ я просто пропустил что-то, чего я не вижу?
Хорошо, я вижу проблему. Ваша SplitString также возвращает непечатаемый символ в строке 32. Итак, попробуйте так: SLPrice := Trim(prices32) - 0.10
Обрезать непечатаемый символ. В противном случае начните удалять самый правый символ по одному, пока не получите число. Я отредактировал ниже.
@PGilm Спасибо, но SLPrice все еще не отображается в MsgBox :(
@PGilm Я также пытался использовать 3 функции внизу этой страницы, но не получилось: autohotkey.com/boards/viewtopic.php?t=10749
@MattWilson Ну, из первого окна сообщения есть что-то, вызывающее "." для переноса на следующую строку. Может быть, использовать: SLPrice := SubStr(Trim(prices32), 1, 5) - 0.10
чтобы вытащить левые 5 символов?
@PGilm Бинго!! Это сделало это! Большое спасибо! Я обновлю свой вопрос этим ответом и отмечу ваш ответ ниже как тот, который его исправил. Большое спасибо за участие, вы меня многому научили!
Ты на правильном пути. Но, согласно моему комментарию, примечание :=
подразумевает выражения, включающие переменные выражения (следовательно, без окружающих %
):
; Assign entry price variable.
StringSplit, prices, Window1Text, `n
MsgBox, Your entry price is %prices32%.
; Assign Stop Loss variable
; Note, the 32 line also includes non printing characters
; so must be trimmed and then we take the left 5 characters
SLPrice := SubStr(Trim(prices32), 1, 5) - 0.10
MsgBox, Your SLPrice is %SLPrice%.
Должен сделать. . .
И обратите внимание, использование something := %myvariable%
подразумевает чтение содержимого переменной с именем myvariable
и использование этого содержимого в качестве имени переменной. Итак, если myvariable
является «тестом», вы на самом деле говорите something := test
(где что-то оказывается равным содержимому переменной test
).
Хт,
РЕДАКТИРОВАТЬ, как показано ниже, вот рабочий пример (НО ПОСЛЕДНИЙ КОММЕНТАРИЙ, СМ. НИЖЕ ТОЖЕ):
Window1Text =
(
25
26
27
28
)
; Assign entry price variable.
StringSplit, prices, Window1Text, `n
MsgBox, Your entry price is %prices2%. ; using only 2nd line (26)
; Assign Stop Loss variable
SLPrice := prices2 - 0.10 ; again, changed to 2nd line
MsgBox, Your SLPrice is %SLPrice%. ; 25.900000
clipboard := SLPrice
ХТХ,
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: потому что это действительно круто и иллюстрирует несколько концепций относительно того, как они относятся к выражениям переменной псевдомассива:
Window1Text =
(
25
26
27
28
)
; Assign entry price variable.
StringSplit, prices, Window1Text, `n ; (prices0 is the number of entries)
InputBox, num,, % "Pick an array number from 1 to " prices0 ; get the array number
; note the variable expression includes the num variable contents
MsgBox, % "Your entry price is " Trim(prices%num%) "." ; depends on array number
; Assign Stop Loss variable
SLPrice := Trim(prices%num%) - 0.10 ; uses the array number value
MsgBox, Your SLPrice is %SLPrice%. ; so depends on the array number
clipboard := SLPrice
Верно?
Но обратите внимание, эти тестеры работают легко. Пример из реальной жизни из OP - это скопированный текст, а строка 32 содержит непечатаемые символы, с которыми работает Trim(x)
, и принимает только первые несколько символов слева с помощью SubStr(x,1,5)
.
Спасибо за вашу помощь! Понятное объяснение, но мне просто любопытно, второй MsgBox теперь отображает текст Ваша SLЦена . Значит, в окне сообщения не отображается целое число? Если это имеет смысл. Я хотел бы, чтобы он точно сообщал мне, что такое число SLPrice, чтобы я знал, что оно работает (т. е. оно снимает 0,10 с числа цены входа, если это имеет смысл). Я очень ценю ваш вклад!
Убедитесь, что вы скопировали его полностью. Мне пришлось внести изменения, потому что в моем исходном тесте не было 32-строчной записи для Window1Text
, поэтому я написал это в своем тесте как prices2
и изначально использовал это в своем ответе. Я добавлю тест, чтобы показать. Иначе какая версия AHK? Моя актуальна.
Или еще лучше, еще один рабочий пример, который также иллюстрирует использование переменных выражений в выражениях (а именно, версия something := %variable%
).
Имеет ли значение удаление знаков
%
(SLPrice = prices32 - 0.10
)?