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.




USING: combinators formatting io kernel math math.parser
sequences ;
IN: rosetta-code.middle-three-digits
 
CONSTANT: test-values {
    123 12345 1234567 987654321 10001 -10001
    -123 -100 100 -12345 1 2 -1 -10 2002 -2002 0
}
 
: (middle-three) ( str -- str' )
    [ midpoint@ [ 1 - ] [ 2 + ] bi ] [ subseq ] bi ;
 
: too-short ( -- )
    "Number must have at least three digits." print ;
 
: number-even ( -- )
    "Number must have an odd number of digits." print ;
 
: middle-three ( n -- )
    abs number>string {
        { [ dup length 3 < ] [ drop too-short ] }
        { [ dup length even? ] [ drop number-even ] }
        [ (middle-three) print ]
    } cond ;
 
: main ( -- )
    test-values [ dup "%9d : " printf middle-three ] each ;
 
MAIN: main