Task

Write a function/procedure/subroutine that is called with an integer value and returns the middle three digits of the integer if possible or a clear indication of an error if this is not possible.

Note: The order of the middle digits should be preserved.

Your function should be tested with the following values; the first line should return valid answers, those of the second line should return clear indications of an error:

123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345
1, 2, -1, -10, 2002, -2002, 0

Show your output on this page.




middle_three_digits = proc (n: int) returns (string)
                      signals (too_small, even_length)
    s: string := int$unparse(int$abs(n))
    if string$size(s) < 3 then signal too_small end
    if string$size(s) // 2 = 0 then signal even_length end
    return(string$substr(s, string$size(s)/2, 3))
end middle_three_digits
 
start_up = proc ()
    po: stream := stream$primary_output()
    tests: sequence[int] := sequence[int]$
        [123,12345,1234567,987654321,10001,-10001,-123,-100,100,-12345,
         1,2,-1,-10,2002,-2002,0]
 
    for test: int in sequence[int]$elements(tests) do
        stream$putright(po, int$unparse(test) || ": ", 11)
 
        stream$putl(po, middle_three_digits(test))
        except 
            when too_small: stream$putl(po, "Too small")
            when even_length: stream$putl(po, "Even length")
        end
    end
end start_up