TABLE OF CONTENTS
::pwtk::type::number
SYNOPSIS
proc ::pwtk::type::number {args} {
USAGE
::pwtk::type::number type ?-strict? value
PURPOSE
Query if a value (or number) is of corrected type. The following types are supported:
integer | int
double
boolean
fboolean
binary
posint
nonposint
negint
nonnegint
real | double | float
posreal | posdouble | posfloat
nonposreal | nonposdouble | nonposfloat
negreal | negdouble | negfloat
nonnegreal | nonnegdouble | nonnegfloat
OPTION
- -strict -- if this option is specified, the empty value does not much
ARGUMENTS
- type -- the type
- value -- value for which to test the type
RETURN VALUE
1 or 0
SOURCE
args_
# perhaps number is specified in Fortran syntax, e.g., 1.0d0
set number [::pwtk::f2c_number $number]
if { $strict eq {} && $number eq {} } {
# for non-strict, empty string matches all types
return 1
}
switch -glob -- $type {
fboolean {
# boolean + Fortran logic (.t. .f. .true. .false.)
return [string is boolean -strict [string trim $number .]]
}
boolean {
return [string is boolean -strict $number]
}
*int* - binary {
if { ! [string is integer -strict $number] } {
return 0
}
}
*real - *double - *float {
if { ! [string is double -strict $number] } {
return 0
}
}
}
switch -glob -- $type {
binary {
# 0 or 1
if { $number == 0 || $number == 1 } {
return 1
} else {
return 0
}
}
nonpos* {
return [expr $number <= 0]
}
nonneg* {
return [expr $number >=0]
}
pos* {
return [expr $number > 0]
}
neg* {
return [expr $number < 0]
}
int* {
return [string is integer -strict $number]
}
real - double - float {
return [string is double -strict $number]
}
}
# if we came here somting is wrong:
::error "unsupported type $type" 1
}