There is simply no point in "taking the first nine numbers out".
And there shouldn't BE a test for the string being empty, anywhere.
'' '-' '---' and so on should all be handled the same way.
Oh well, what stops you doing
digits := aString select: [:each | each ~= $-].
digits size = 10 ifFalse: [^false].
lastDigit := digits la ost.
digits := digits copyFrom: 1 to: 9.
( (lastDigit = $X or: [lastDigit isDigit]) and: [
digits allSatisfy: #isDigit]
) ifFalse: [^false].
Now my code does not do this, but it is just 16 lines of code with
nothing that it would make sense to extract.