Jak zweryfikować dane wejściowe użytkownika jako liczbę całkowitą, a następnie potwierdź, że liczba całkowita jest określoną długością przy użyciu skryptu Apple

0

Buduję skrypt Apple, aby monitować i otrzymywać dane od użytkownika za pośrednictwem okna dialogowego. Domyślna odpowiedź okna dialogowego to „Wprowadź kod”. Wymagany wpis to 6-cyfrowy kod nadany każdemu użytkownikowi. Po otrzymaniu danych wejściowych (lub kodu) użytkownika, niektóre weryfikacje muszą zostać przeprowadzone, potwierdzając, że dane wejściowe użytkownika są dopuszczalne na podstawie następujących warunków:

  1. Użytkownik nie może wprowadzać liter ani symboli.

  2. Wejście musi być liczbą całkowitą (tylko liczby całkowite i liczba zera tak).

  3. Kod (wejściowy) ma długość dokładnie (lub równą) 6 cyfr. Nie więcej lub nie mniej niż 6.

tło - kod użytkownika jest generowany ad-hoc z innej aplikacji i jest niepowtarzalny za każdym razem. Nie ma możliwości odwołania się do tego kodu.


Na przykład użytkownik wprowadza 123456 w oknie dialogowym. Używając Apple Script, jak mogę to napisać, upewniając się ponownie, że kod to wszystkie liczby i dokładnie 6 cyfr?

The Terminaltor
źródło
Z czym eksperymentowałeś w Automatorze, aby wypróbować walidację, ale to się nie udało?
IconDaemon
Co się stanie, jeśli kod zaczyna się od 0?
Mark
Zasadniczo ten kod nie powinien mieć nic wspólnego z typami numerycznymi. Sprawdź, czy łańcuch ma 6 znaków, a każdy z nich jest w zakresie 0-9. W takim przypadku wyrażenie regularne może nie dodawać problemów.
Mark

Odpowiedzi:

1

Rozwiązanie 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)

Rozwiązanie 2:

Rozwiązanie to jest wyjątkowo krótkie, ale traktuje problem tak, jak powinien być traktowany. Mylące jest twierdzenie, że chcesz „sprawdzaj dane wejściowe użytkownika jako liczbę całkowitą” , kiedy w rzeczywistości mamy do czynienia tylko z tekstem. Hasło jest 6-znakowym hasłem, a te znaki są ograniczone do wartości unicode reprezentujących cyfry; ale są to nadal znaki tekstowe, a nie liczby całkowite w dowolnym znaczeniu liczbowym.

znak komentarz przeciwko temu pytaniu faktycznie to stwierdzał, ale nawet ja wpadłem w myśl, że chcę ocenić dane wejściowe jako liczby, co jest częściowo tym, co Solution 1 powyżej robi; i działa, i jest to doskonale dobre rozwiązanie, ale wykonuje niepotrzebne kroki, aby osiągnąć wynik końcowy.

Traktowanie wkładu wyłącznie jako tekstu, problem zwięźle określony przez znak to jest „Sprawdź, czy łańcuch ma 6 znaków, a każdy z nich jest w zakresie 0–9”. To właśnie robi to rozwiązanie w jednej prostej linii:

set input to "123456"

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

Zmienna validation będzie zawierać 6-cyfrowy kod, jeśli jest ważny, lub "Invalid input" Inaczej.

CJK
źródło
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
źródło
Czy to pozwala na znak musi i kropkę dziesiętną?
Mark
@mark Ups ..... ustalanie
JBis
Jak stwierdził @Mark, co jeśli kod zaczyna się od zera? Walidacja się nie powiedzie, prawda?
The Terminaltor
Naprawiono @ TheTerminaltor.
JBis
1
Dobre pytanie, prawdopodobnie z więcej niż jednym rozwiązaniem. Ale myślę, że pierwszym sprawdzeniem jest przede wszystkim długość wejścia; a ostatnia (lub jedna z ostatnich) kontroli polega na tym, że wymusza liczbę. Ponadto, jeśli jedno sprawdzenie się nie powiedzie, pozostałe czeki są zbędne; Jeśli jednak twój kod nie będzie przymuszał do liczby, nadal sprawdza inne kryteria (chociaż zdaję sobie sprawę, że mogą być sytuacje, w których byłoby to przydatne, a mianowicie, gdybyśmy chcieli znać podział wszystkich błędów znalezionych w danych wejściowych użytkownika).
CJK