Middle three digits: Difference between revisions

Add REXX
(→‎{{header|D}}: drop the concat)
(Add REXX)
Line 310:
middle_three_digits(0) returned: AssertionError('Need odd and >= 3 digits',)
>>> </lang>
 
=={{header|REXX}}==
<lang rexx>/* REXX ***************************************************************
* 03.02.2013 Walter Pachl
**********************************************************************/
sl='123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345',
'2 -1 -10 2002 -2002 0 abc 1e3 -17e-3'
Do While sl<>'' /* loop through test values */
Parse Var sl s sl /* pick next value */
Call mid3 s /* test it */
End
Exit
mid3: Procedure
Parse arg d /* take the argument */
Select /* first test for valid input */
When datatype(d)<>'NUM' Then Call error 'not a number'
When pos('E',translate(d))>0 Then Call error 'not just digits'
When length(abs(d))<3 Then Call error 'less than 3 digits'
When length(abs(d))//2<>1 Then Call error 'not an odd number of digits'
Otherwise Do /* input is ok */
dx=abs(d) /* get rid of optional sign */
ld=length(dx) /* length of digit string */
z=(ld-3)/2 /* number of digits to cut */
Say left(d,12) '->' substr(dx,z+1,3) /* show middle 3 digits */
End
End
Return
error:
Say left(d,12) '->' arg(1) /* tell about the problem */
Return
</lang>
Output:
>pre>
123 -> 123
12345 -> 234
1234567 -> 345
987654321 -> 654
10001 -> 000
-10001 -> 000
-123 -> 123
-100 -> 100
100 -> 100
-12345 -> 234
2 -> less than 3 digits
-1 -> less than 3 digits
-10 -> less than 3 digits
2002 -> not an odd number of digits
-2002 -> not an odd number of digits
0 -> less than 3 digits
abc -> not a number
1e3 -> not just digits
-17e-3 -> not just digits
</pre>
 
=={{header|Rust}}==
2,301

edits