Выражения переменных Autohotkey для псевдомассивов - преобразовать строку в число?

Ответ на этот вопрос был дан внизу этого поста.

Я просмотрел 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

Выражения переменных Autohotkey для псевдомассивов - преобразовать строку в число?

; Assign entry price variable.
StringSplit, prices, Window1Text, `n
MsgBox, Your entry price is %prices32%.

Выражения переменных Autohotkey для псевдомассивов - преобразовать строку в число?

; Assign Stop Loss variable
SLPrice := prices32 - 0.10
MsgBox, Your SLPrice is %SLPrice%.

Выражения переменных Autohotkey для псевдомассивов - преобразовать строку в число?

ОТВЕЧАТЬ Благодаря нижеуказанному участнику мы обнаружили, что существует "." из первого MsgBox испортил переменную SLPrice, поэтому мы обновили переменную SLPrice, чтобы она читалась так:

SLPrice := SubStr(Trim(prices32), 1, 5) - 0.10 ; to pull the left 5 characters

Спасибо!

Имеет ли значение удаление знаков % (SLPrice = prices32 - 0.10)?

Ken White 29.05.2019 19:16

должно, но не так, как у вас. Это SLPrice := prices32 - 0.10, потому что оператор := предполагает выражения! Подробности смотрите в моем ответе.

PGilm 29.05.2019 22:32

@PGilm Смотрите мой комментарий ниже. Я думаю, что мы близки, но теперь второй msgbox на самом деле не отображает номер?

Matt Wilson 30.05.2019 05:30

Да, в моем исходном сообщении были опечатки в переменной (поскольку я изменил ее, чтобы она подходила для собственного теста). Затем я отредактировал ответ (несколько раз), чтобы уточнить, и когда я заметил эту ошибку (я использовал prices2). Поэтому я добавил наглядный пример после вашего комментария. Что ж, тогда я заинтересовался его более общим использованием с псевдомассивом, который вы создали из Window1Text, и добавил версию с полем ввода и выражение переменной псевдомассива, потому что именно поэтому в AHK есть псевдомассивы!

PGilm 30.05.2019 20:27

@PGilm Я очень ценю ваш вклад, но что-то с моей стороны все еще не работает с вашими обновленными ответами. Я обновил свой вопрос выше, включив в него полный код и скриншоты того, что показывает мне MsgBox. Ваш пример работает, когда вы передаете ему массив так, как у вас есть, но когда я пытаюсь обновить его, чтобы использовать мои данные из SplitString, он не работает :( Я использую AHK 1.1.30.03. Есть еще мысли? ИЛИ я просто пропустил что-то, чего я не вижу?

Matt Wilson 30.05.2019 23:34

Хорошо, я вижу проблему. Ваша SplitString также возвращает непечатаемый символ в строке 32. Итак, попробуйте так: SLPrice := Trim(prices32) - 0.10 Обрезать непечатаемый символ. В противном случае начните удалять самый правый символ по одному, пока не получите число. Я отредактировал ниже.

PGilm 31.05.2019 02:22

@PGilm Спасибо, но SLPrice все еще не отображается в MsgBox :(

Matt Wilson 31.05.2019 02:28

@PGilm Я также пытался использовать 3 функции внизу этой страницы, но не получилось: autohotkey.com/boards/viewtopic.php?t=10749

Matt Wilson 31.05.2019 02:38

@MattWilson Ну, из первого окна сообщения есть что-то, вызывающее "." для переноса на следующую строку. Может быть, использовать: SLPrice := SubStr(Trim(prices32), 1, 5) - 0.10 чтобы вытащить левые 5 символов?

PGilm 31.05.2019 02:39

@PGilm Бинго!! Это сделало это! Большое спасибо! Я обновлю свой вопрос этим ответом и отмечу ваш ответ ниже как тот, который его исправил. Большое спасибо за участие, вы меня многому научили!

Matt Wilson 31.05.2019 02:45
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
10
258
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ты на правильном пути. Но, согласно моему комментарию, примечание := подразумевает выражения, включающие переменные выражения (следовательно, без окружающих %):

; 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 с числа цены входа, если это имеет смысл). Я очень ценю ваш вклад!

Matt Wilson 30.05.2019 05:16

Убедитесь, что вы скопировали его полностью. Мне пришлось внести изменения, потому что в моем исходном тесте не было 32-строчной записи для Window1Text, поэтому я написал это в своем тесте как prices2 и изначально использовал это в своем ответе. Я добавлю тест, чтобы показать. Иначе какая версия AHK? Моя актуальна.

PGilm 30.05.2019 18:25

Или еще лучше, еще один рабочий пример, который также иллюстрирует использование переменных выражений в выражениях (а именно, версия something := %variable%).

PGilm 30.05.2019 20:01

Другие вопросы по теме