Ajuda com código

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Lacorte
Posts: 8
Joined: 03 Jul 2019, 05:36

Ajuda com código

Post by Lacorte » 15 Dec 2020, 17:36

Amigos, boa noite.
Sou novato no AHK mas com muita pesquisa estou conseguindo desenvolver uma automação para minha demanda. Cheguei ao código abaixo mas tenho 2 problemas:

1º Problema: Nessa parte do código não consigo fazê-lo retornar a soma no formato "0.000,00", ele me retorna no formato "0.000,000000", com 6 casas decimais, preciso que me retorne com 2 casas decimais.

Code: Select all

Numero1 := Var2
Numero2 := "5,00"

Var3 := TrabalharFormato(Numero1) + TrabalharFormato(Numero2)
Var4 := TrabalharFormato(Numero1) - TrabalharFormato(Numero2)

;Msgbox, %Var3% 

TrabalharFormato(ByRef Valor, Casas = 2) 
{
   stringreplace Valor, Valor, %A_Space%
   stringgetpos commapos, Valor, `,
   stringgetpos dotpos, Valor, .
   if (dotpos > commapos and dotpos > 0 and commapos > 0)
   {
      stringreplace Valor, Valor, `,
   }
   if Valor is not number
   {
      stringreplace Valor, Valor, .
      stringreplace Valor, Valor, `,,.
   }
   Valor := Round(Valor, Casas)
   return Valor
}
2ª Problema: Não consigo fazer o código funcionar quando junto a primeira parte (identificação das varíáveis) com a última parte (envio dos comandos). Certamente não estou sabendo montá-lo corretamente.

Code: Select all

F1::
;Send, {Win down}r{Win up}

;;;;;;;;;;;;;;;;;;;; retorna a 1ª palavra da última linha

FileRead, Log_Profit, C:\Users\Lacorte\Desktop\LOGSPROFIT.txt

RegExMatch(Log_Profit, "(?:^|\n)(.*)$", Last_Line) ; the last line could be the only line

test	:= Last_Line

Var1 := GetFirstWord(test, 1)

GetFirstWord(word, num){
	StringSplit, wordArray, word, % A_Space
	return wordArray%num%
}
;Msgbox, %Var1% 

;;;;;;;;;;;;;;;;;;;; retorna o preço de entrada

RegExMatch(Last_Line, "\d.\d\d\d,\d\d", Preco)

Preco_Entrada := Preco "`n"

Var2 := Preco_Entrada

;Msgbox, %Var2% 

;;;;;;;;;;;;;;;;;;;; Adiciona ou subtrai, dependendo da Var1

Numero1 := Var2
Numero2 := "5,00"

Var3 := TrabalharFormato(Numero1) + TrabalharFormato(Numero2)
Var4 := TrabalharFormato(Numero1) - TrabalharFormato(Numero2)

;Msgbox, %Var3% 

TrabalharFormato(ByRef Valor, Casas = 2) 
{
   stringreplace Valor, Valor, %A_Space%
   stringgetpos commapos, Valor, `,
   stringgetpos dotpos, Valor, .
   if (dotpos > commapos and dotpos > 0 and commapos > 0)
   {
      stringreplace Valor, Valor, `,
   }
   if Valor is not number
   {
      stringreplace Valor, Valor, .
      stringreplace Valor, Valor, `,,.
   }
   Valor := Round(Valor, Casas)
   return Valor
}

;;;;;;;;;;;;;;;;;;;; Código

If (Var1 = "Vendido")
{
	MouseMove 469, 162
	Click, 2
	Send %Var3%
	MouseMove 269, 162
	Click, 2
	Send, "10"
	MouseMove 571, 234
}
else if (Var1 = "Comprado")
{
MouseMove 469, 162
	Click, 2
	Send %Var4%
	MouseMove 269, 162
	Click, 2
	Send, "20"
	MouseMove 648, 234	
}	
else if (Var1 = "0")
{
MouseMove 507, 807
}	

return
Se alguma alma puder me ajudar ficarei extremamente agradecido. Obrigado!
jrufino
Posts: 31
Joined: 25 Oct 2019, 07:17

Re: Ajuda com código

Post by jrufino » 17 Dec 2020, 07:56

Para a primeira dúvida tenta utilizar o comando abaixo, ele passa o resultado para o padrão brasileiro com 2 casas decimais:
StrReplace(ROUND(VARIAVEL, 2), ".", "`,")

Obs: Mas só utiliza ele depois que fizer os calculos matematicos e quiser mostrar o resultado.

Para a segunda dúvida não sei te ajudar :thumbdown:
User avatar
Gio
Posts: 1120
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda com código

Post by Gio » 18 Dec 2020, 11:20

Bom dia Lacorte.

Seja bem-vindo ao fórum da comunidade do AutoHotkey.

Você pode fazer da forma como o Jrufino disse acima. Explicarei um pouco mais caso ainda não tenha entendido (e caso queira trabalhar formatar em 0.000,00 para número acima de 1.000,00):


A função TrabalharFormato() transforma um valor cuja formatação esteja entre diversos tipos possíveis para uma formatação que o AutoHotkey entenda como matemática, de modo que seja possível somar este valor usando o operador +, por exemplo. O problema é que sempre que o AutoHotkey trabalha matematicamente um valor (como no caso da soma), ele entrega de novo o resultado com 6 casas decimais. Dessa forma, apesar da função estar passando 0.00 e 5.00 ao AutoHotkey, a soma que o código está fazendo retorna 5.000000 (seis casas) em Var3, pois o valor foi novamente trabalhado pelo AutoHotkey por ocasião da soma (que foi feita APÓS as chamadas à função).

:arrow: Se você quiser, você pode usar a função embutida Round() para arredondar o valor para 2 casas decimais APÓS a soma. Além disso, pode usar também a função Exibir(), disponível no mesmo tutorial, para transformar o valor para o formato brasileiro.


exemplo:

Code: Select all

Numero1 := Var2
Numero2 := "5,00"

Var3 := Exibir(Round(TrabalharFormato(Numero1) + TrabalharFormato(Numero2), 2))
Var4 := Exibir(Round(TrabalharFormato(Numero1) - TrabalharFormato(Numero2), 2))
msgbox % Var3
msgbox % Var4
REturn
;Msgbox, %Var3% 

TrabalharFormato(ByRef Valor, Casas = 2) 
{
   stringreplace Valor, Valor, %A_Space%
   stringgetpos commapos, Valor, `,
   stringgetpos dotpos, Valor, .
   if (dotpos > commapos and dotpos > 0 and commapos > 0)
   {
      stringreplace Valor, Valor, `,
   }
   if Valor is not number
   {
      stringreplace Valor, Valor, .
      stringreplace Valor, Valor, `,,.
   }
   Valor := Round(Valor, Casas)
   return Valor
}
return


Exibir(ByRef Valor)
{
   StringReplace Valor, Valor, .,`,
   RegExReplace(Valor, "\G\d+?(?=(\d{3})+(?:\D|$))", "$0.")
   Return Valor
}
Return



:arrow: Com relação à sua segunda dúvida, você não pode colocar o corpo de uma função no meio do código da seção de autoexecução. Todas as funções devem vir APÓS a seção de autoexecução, pois elas são blocos de códigos independentes, cuja execução só pular para lá quando a função for chamada. Dessa forma, se você colocar o corpo da função no meio de uma sequência de códigos, a execução vai PARAR antes da linha que define o corpo da função.

Solução: coloque o corpo da função EMBAIXO de todo o código que você quer executar.

Exemplo:

Code: Select all

F1::
;Send, {Win down}r{Win up}

;;;;;;;;;;;;;;;;;;;; retorna a 1ª palavra da última linha

FileRead, Log_Profit, C:\Users\Lacorte\Desktop\LOGSPROFIT.txt

RegExMatch(Log_Profit, "(?:^|\n)(.*)$", Last_Line) ; the last line could be the only line

test	:= Last_Line

Var1 := GetFirstWord(test, 1)

GetFirstWord(word, num){
	StringSplit, wordArray, word, % A_Space
	return wordArray%num%
}
;Msgbox, %Var1% 

;;;;;;;;;;;;;;;;;;;; retorna o preço de entrada

RegExMatch(Last_Line, "\d.\d\d\d,\d\d", Preco)

Preco_Entrada := Preco "`n"

Var2 := Preco_Entrada

;Msgbox, %Var2% 

;;;;;;;;;;;;;;;;;;;; Adiciona ou subtrai, dependendo da Var1

Numero1 := Var2
Numero2 := "5,00"

Var3 := TrabalharFormato(Numero1) + TrabalharFormato(Numero2)
Var4 := TrabalharFormato(Numero1) - TrabalharFormato(Numero2)

;Msgbox, %Var3% 


;;;;;;;;;;;;;;;;;;;; Código

If (Var1 = "Vendido")
{
	MouseMove 469, 162
	Click, 2
	Send %Var3%
	MouseMove 269, 162
	Click, 2
	Send, "10"
	MouseMove 571, 234
}
else if (Var1 = "Comprado")
{
MouseMove 469, 162
	Click, 2
	Send %Var4%
	MouseMove 269, 162
	Click, 2
	Send, "20"
	MouseMove 648, 234	
}	
else if (Var1 = "0")
{
MouseMove 507, 807
}	

return


TrabalharFormato(ByRef Valor, Casas = 2) 
{
   stringreplace Valor, Valor, %A_Space%
   stringgetpos commapos, Valor, `,
   stringgetpos dotpos, Valor, .
   if (dotpos > commapos and dotpos > 0 and commapos > 0)
   {
      stringreplace Valor, Valor, `,
   }
   if Valor is not number
   {
      stringreplace Valor, Valor, .
      stringreplace Valor, Valor, `,,.
   }
   Valor := Round(Valor, Casas)
   return Valor
}

OBS: No código acima eu só reorganizei as posições para que a execução continuasse após a linha ;;;;;;;;;;;;;;;;;;;; Código, eu não sei o que você escreveu e se esse código vai fazer o que você queria ok? :beer:


Espero ter ajudado, se ainda tiver alguma dúvida sobre este tópico, basta postar abaixo :thumbup:
Post Reply

Return to “Ajuda e Suporte Geral”