Como validar a entrada do usuário como número inteiro e confirmar se o número inteiro é um comprimento específico usando o Apple Script

0

Estou criando um Apple Script para solicitar e receber entrada de um usuário por meio de uma caixa de diálogo. A resposta padrão da caixa de diálogo é "Digite o código". A entrada necessária é um código de 6 dígitos fornecido para cada usuário. Ao receber a entrada (ou código) do usuário, algumas verificações de validação precisam ocorrer, confirmando que a entrada do usuário é aceitável com base nas seguintes condições:

  1. O usuário não pode inserir letras ou símbolos.

  2. A entrada deve estar em um número inteiro (apenas números inteiros e sim zero conta).

  3. O código (entrada), basta ter exatamente (ou igual a) 6 dígitos. Não mais ou menos que 6.

Segundo plano - o código do usuário é gerado ad-hoc a partir de outro aplicativo e é único a cada vez. Não há como fazer referência cruzada a esse código.


Por exemplo, o usuário digita 123456 na caixa de diálogo. Usando o Apple Script, como posso fazer o script, garantindo novamente que o código seja todos os números e com precisão de 6 dígitos?

O Terminaltor
fonte
Com o que você experimentou no Automator para tentar a validação, mas ela falhou?
IconDaemon 31/07/2018
O que acontece se o código começar com 0?
Mark
Basicamente, esse código não deve ter nada a ver com tipos numéricos. Verifique se a string possui 6 caracteres e cada uma delas está no intervalo de 0 a 9. Nesse caso, uma regex pode não aumentar os problemas.
Mark

Respostas:

1

Solução 1:

set input to "123456"

if the length of the input  6 ¬
    then return "Wrong number of characters."

try
    if "0123456789" does not contain item 1 of the input ¬
        or item -1 of the input is in [space, tab, linefeed] ¬
        then error

    set input to input as number

    if class of the input  integer then error
on error
    return "Invalid characters."
end try



text -6 thru -1 of ("000000" & the input)

Solução 2:

Esta solução se beneficia de ser extremamente curta, mas também trata o problema como deve ser tratado. É um equívoco dizer que você deseja "validar a entrada do usuário como inteiro" , quando, na verdade, estamos apenas lidando com texto. A senha é uma senha de 6 caracteres e esses caracteres são limitados aos valores unicode que representam dígitos; mas eles ainda são caracteres de texto e não números inteiros em nenhum sentido numérico.

O comentário de Mark contra a questão realmente afirmou isso, mas até eu caí na mente de querer avaliar a entrada como números, o que é parcialmente o que Solution 1acima faz; e funciona, e é uma solução perfeitamente boa, mas executa etapas desnecessárias para chegar ao resultado final.

Tratando a entrada puramente como texto, o problema, tão sucintamente declarado por Mark, é "Verifique se a string possui 6 caracteres e cada uma delas está no intervalo de 0 a 9". Então é exatamente isso que essa solução faz, em uma linha simples:

set input to "123456"

set validation to do shell script ¬
    "egrep -x '[0-9]{6}' <<<" & ¬
    quoted form of the input & ¬
    "|| echo Invalid input"

A variável validationconterá o código de 6 dígitos, se for válido ou "Invalid input"não.

CJK
fonte
0
display dialog "Enter Your Code" default answer "" with hidden answer # Ask for user input as dots instead of text
set myCode to the text returned of the result as string # set myCode to what the user enters
set isNum to true # define isNum as true unless changed
try
    set bla to myCode as number # will fail if myCode is not a number
on error
    set isNum to false # failed
end try
set prohibitedChars to {".", " ", "+", "-"}
set myItems to every item of myCode
set containsGoodChars to true
repeat with i in myItems
    if i is in prohibitedChars then
        set containsGoodChars to false
    end if
end repeat
if ((length of myCode is 6) and (isNum) and (containsGoodChars)) then # if myCode is 6 characters long and it is a number then

    --do some code

else # validation failed
    display dialog "You failed. And so did the validation."
end if
JBis
fonte
não, você não corrigiu 0 inicial ou -.ou +. Baically conversão para um numérico para um código está errado
Mark
@ Mark eu acho que isso é bom agora. 0 inicial é permitido.
JBis
Eu sinto que, se você tivesse considerado com mais cuidado a ordem em que realiza suas verificações de validação, o código resultante teria se tornado muito mais agradável.
CJK
@CJK Em que ordem você o sugeriu?
JBIS
1
Boa pergunta, provavelmente com mais de uma solução. Mas acho que a primeira verificação é crucialmente a duração da entrada; e o último (ou um dos últimos) cheques é que ele coage para um número. Além disso, se uma verificação falhar, as demais serão supérfluas; no entanto, se seu código não forçar a um número, ele continuará verificando outros critérios (embora reconheço que pode haver situações em que isso seria útil, ou seja, se desejássemos conhecer um detalhamento de todos os erros encontrados na entrada do usuário).
CJK