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.




/* NetRexx */
options replace format comments java crossref symbols nobinary
 
sl = '123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345' -
     '1 2 -1 -10 2002 -2002 0' -
     'abc 1e3 -17e-3 4004.5 12345678 9876543210' -- extras
 
parse arg digsL digsR .
if \digsL.datatype('w') then digsL = 3
if \digsR.datatype('w') then digsR = digsL
if digsL > digsR        then digsR = digsL
 
loop dc = digsL to digsR
  say 'Middle' dc 'characters'
  loop nn = 1 to sl.words()
    val = sl.word(nn)
    say middleDigits(dc, val)
    end nn
  say
  end dc
return
 
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method middle3Digits(val) constant
  return middleDigits(3, val)
 
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method middleDigits(digitCt, val) constant
  text = val.right(15)':'
  even = digitCt // 2 == 0 -- odd or even?
  select
    when digitCt <= 0                       then text = 'digit selection size must be >= 1'
    when \val.datatype('w')                 then text = text 'is not a whole number'
    when val.abs().length < digitCt         then text = text 'has less than' digitCt 'digits'
    when \even & val.abs().length // 2 == 0 then text = text 'does not have an odd number of digits'
    when even  & val.abs().length // 2 \= 0 then text = text 'does not have an even number of digits'
    otherwise do
      val = val.abs()
      valL = val.length
      cutP = (valL - digitCt) % 2
      text = text val.substr(cutP + 1, digitCt)
      end
    catch NumberFormatException
      text = val 'is not numeric'
    end
  return text
 