fexpr

fexpr expression
calculates expression similar expr, but treats any number as floating point

proc fexpr str {
  set sciPat {[0-9](?:\.[0-9]*)?[eE][+-]?[0-9]+}
  set ranges [regexp -inline -indices -all $sciPat $str]
  set sciWords [lmap range $ranges {
      double [string range $str {*}$range]
    }]
  set betweenRanges [concat {*}[lmap range $ranges {
        lassign $range from to
        list [- $from 1] [+ $to 1]
      }]]
  set numPat {\.[0-9]+|[0-9]+(?:\.[0-9]*)?}
  set restWords [lmap {from to} "0 $betweenRanges end" {
      regsub -all $numPat [string range $str $from $to] double(&)
    }]
  foreach restWord $restWords sciWord $sciWords {
    append result $restWord $sciWord
  }
  expr $result
}

© Wolf-Dieter Busch | Home | Sitemap | Urheber | A-Z