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.




do {
    #1 = Get_Num("Enter a number, or 0 to stop: ", STATLINE)
    Ins_Text("Input: ") Num_Ins(#1, COUNT, 10)
    Call("MIDDLE_3_DIGITS")
    Ins_Text("  Result: ") Reg_Ins(10) Ins_Newline
    Update()
} while (#1);
Return
 
// Find middle 3 digits of a number
//  in: #1 = numeric value
// out: @10 = the result, or error text
//
:MIDDLE_3_DIGITS:
Buf_Switch(Buf_Free)
Num_Ins(abs(#1), LEFT+NOCR)	// the input value as string
#2 = Cur_Col-1			// #2 = number of digits
if (#2 < 3) {
    Reg_Set(10, "Too few digits!")
} else {
    if ((#2 & 1) == 0) {
	Reg_Set(10, "Not odd number of digits!")
    } else {
	Goto_Pos((#2-3)/2)
	Reg_Copy_Block(10, Cur_Pos, Cur_Pos+3)
    }
}
Buf_Quit(OK)
Return 