Cách xác thực đầu vào của người dùng dưới dạng số nguyên, sau đó xác nhận rằng số nguyên có độ dài cụ thể bằng Apple Script


0

Tôi đang xây dựng Apple Script để nhắc và nhận đầu vào từ người dùng thông qua hộp thoại. Câu trả lời mặc định của hộp thoại là "Nhập mã". Đầu vào bắt buộc là mã gồm 6 chữ số được cung cấp cho mỗi người dùng. Khi nhận đầu vào (hoặc mã) của người dùng, một số kiểm tra xác thực cần xảy ra để xác nhận rằng đầu vào của người dùng có thể chấp nhận được dựa trên các điều kiện sau:

  1. Người dùng không thể nhập chữ cái hoặc ký hiệu.

  2. Đầu vào phải ở dạng số nguyên (chỉ toàn bộ số và có số không).

  3. Mã (đầu vào), chỉ cần chính xác (hoặc bằng) dài 6 chữ số. Không nhiều hơn hoặc không ít hơn 6.

Bối cảnh - mã của người dùng được tạo đặc biệt từ một ứng dụng khác và là duy nhất mỗi lần. Không có cách nào để tham chiếu chéo mã này.


Ví dụ, người dùng nhập 123456 vào hộp thoại. Sử dụng Apple Script, làm cách nào tôi có thể tạo tập lệnh này, đảm bảo một lần nữa, mã đó là tất cả các số và chính xác là 6 chữ số?


Bạn đã thử nghiệm điều gì trong Automator để thử xác nhận, nhưng nó đã thất bại?
IconDaemon

Điều gì xảy ra nếu mã bắt đầu bằng 0?
Đánh dấu

Về cơ bản mã này không có gì để làm với các loại số. Kiểm tra chuỗi có 6 ký tự và mỗi ký tự nằm trong phạm vi 0-9. Trong trường hợp này, một regex có thể không thêm vào các vấn đề.
Đánh dấu

Câu trả lời:


1

Giải pháp 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)

Giải pháp 2:

Giải pháp này có lợi từ việc cực kỳ ngắn, nhưng cũng xử lý vấn đề vì nó cần được xử lý. Thật sai lầm khi nói rằng bạn muốn "xác thực đầu vào của người dùng là số nguyên" , trên thực tế, khi chúng ta chỉ xử lý văn bản. Mật mã là mật mã gồm 6 ký tự và các ký tự đó được giới hạn ở các giá trị unicode đại diện cho các chữ số; nhưng chúng vẫn là các ký tự văn bản, và không phải là số nguyên theo bất kỳ ý nghĩa số nào.

Nhận xét của Mark đối với câu hỏi thực sự đã nêu điều này, nhưng ngay cả tôi cũng rơi vào suy nghĩ muốn đánh giá đầu vào là con số, một phần là những gì Solution 1ở trên; và nó hoạt động, và nó là một giải pháp hoàn toàn tốt, nhưng nó thực hiện các bước không cần thiết để đi đến kết quả cuối cùng.

Đối xử với đầu vào hoàn toàn là văn bản, vấn đề, do Mark tuyên bố ngắn gọn là "Kiểm tra chuỗi có 6 ký tự và mỗi ký tự nằm trong phạm vi 0-9". Vì vậy, đó chính xác là những gì giải pháp này làm, trong một dòng đơn giản:

set input to "123456"

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

Biến validationsẽ chứa mã gồm 6 chữ số nếu nó hợp lệ hoặc "Invalid input"nếu không.


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

không, bạn chưa cố định dẫn 0 hoặc -.or +. Chuyển đổi về mặt số thành một số cho một mã là sai
Đánh dấu

@Mark Tôi nghĩ cái này tốt bây giờ. Dẫn đầu 0 được cho phép.
JBis

Tôi cảm thấy rằng, nếu bạn đã xem xét cẩn thận hơn thứ tự mà bạn thực hiện kiểm tra xác thực của mình, mã kết quả sẽ trở nên dễ chịu hơn rất nhiều.
CJK

@CJK Theo thứ tự nào bạn sẽ đề nghị nó?
JBis

1
Câu hỏi hay, có lẽ với nhiều hơn một giải pháp. Nhưng tôi nghĩ rằng kiểm tra đầu tiên chủ yếu là chiều dài của đầu vào; và kiểm tra cuối cùng (hoặc một trong những kiểm tra cuối cùng) là nó cưỡng chế một số. Ngoài ra, nếu một kiểm tra thất bại, các kiểm tra còn lại là không cần thiết; tuy nhiên, nếu mã của bạn không ép buộc thành một số, nó vẫn tiếp tục kiểm tra các tiêu chí khác (mặc dù tôi nhận thấy có thể có tình huống này sẽ hữu ích, cụ thể là nếu chúng tôi muốn biết phân tích tất cả các lỗi được tìm thấy trong đầu vào của người dùng).
CJK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.