RosettaCodeData/Task/Middle-three-digits/Tcl/middle-three-digits.tcl
2026-04-30 12:34:36 -04:00

91 lines
1.6 KiB
Tcl

#!/usr/bin/env tclsh
# output middle 3 digits or error
# good integers
set good {123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345}
# bad integers
set bad {doggy 1 2 -1 -10 2002 -2002 0}
proc middle_3 {num} {
# error messages
array set error {
notint {(not an integer)}
short {(number < 3 digits)}
even {(even number of digits)}
zero {(zero length entry)}
{unknown} {(unknown error)}
}
set err 0
# must be integer
if { ! [string is integer $num] } {
set err 1
set errstr $error(notint)
}
# work with positive val
if { $num < 0 } { set num [expr {abs($num)} ] }
# how many digits
set dlen [string length $num]
if {$dlen < 3} {
set err 1
set errstr $error(short)
}
if {$dlen % 2 == 0} {
set err 1
set errstr $error(even)
}
if {$err} {
# " (err)"
set output [format "%*s%s" 10 "" "$errstr"]
} else {
# split into list of each letter
set letters [split $num ""]
# middle of list
set mid [expr {$dlen / 2}]
# get 3 in the middle
set a [lindex $letters [expr {$mid-1} ] ]
set b [lindex $letters [expr {$mid} ] ]
set c [lindex $letters [expr {$mid+1} ] ]
# " 123"
set output [format "%*s%d" 10 "" "$a$b$c"]
}
return $output
}
# start here
puts stdout "test good list:\n"
puts stdout "${good}"
foreach num $good {
set n [middle_3 $num ]
puts stdout "$num:\t$n"
}
puts ""
puts stdout "test bad list:\n"
puts stdout "${bad}"
foreach num $bad {
set n [middle_3 $num ]
puts stdout "$num:\t$n"
}