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.




 
	val test_array = ["123","12345","1234567","987654321","10001","~10001","~123","~100","100","~12345","1","2","~1","~10","2002","~2002","0"];
 
	fun even (x rem 2 = 0) = true | _ = false;
 
	fun middleThreeDigits
			(h :: t, s, 1 ) = s @ " --> too small" 
		|	(h :: t, s, 2 ) = s @ " --> has even digits"
		|	(h :: t, s, 3 ) where (len (h :: t) = 3) = s @ " --> " @ (implode (h :: t))
		|	(h :: t, s, 3 ) = (middleThreeDigits ( sub (t, 0, (len t)-1), s, 3)) 
		|	(h :: t, s, m) = if len (h :: t) < 3 then
							middleThreeDigits (h :: t, s, 1)
						  else
						    if even ` len (h :: t) then
							  middleThreeDigits (h :: t, s, 2)
							else
							  middleThreeDigits (h :: t, s, 3)
 
 
		|	s	= if sub (s, 0, 1) = "~" then
				middleThreeDigits (sub (explode s, 1, len s), s, 0)
			else
				middleThreeDigits (explode s, s, 0)
	;
 
	map (println o middleThreeDigits) test_array;