Updated 2004-03-31 08:04:54

if 0 {Richard Suchenwirth 2004-03-31 - Here are functions to map between words (strings over an alphabet, of moderate length up to 10 characters for full precision) and floating-point numbers between 0 and 1, which indicate the lexicographic ordering position. This could be used for instance in custom collation orders. }
 proc sfrac string {
    set res 0.0
    regsub -all {[^a-z ]} [string tolower $string] " " s
    set abc {" " a b c d e f g h i j k l m n o p q r s t u v w x y z}
    set labc [llength $abc]
    set div [expr double($labc)]
    foreach char [split $s ""] {
       set res [expr {$res+[lsearch $abc $char]/$div}]
       set div [expr {$div*$labc}]
    set res

#-- The inverse function:
 proc fracs x {
    set abc {" " a b c d e f g h i j k l m n o p q r s t u v w x y z}
    set labc [llength $abc]
    set res ""
    while {[string length $res]<11} {
       set i [expr {int($x*$labc)}]
       append res [lindex $abc $i]
       set x [expr {$x*$labc-$i}]
    set res

if 0 {Testing, and usage examples:
 % sfrac hell
 % sfrac hello
 % sfrac helloa
 % sfrac world

This is close to the end of alphabet order:
 % sfrac zzzzz

...and the empty string is the beginning:
 % sfrac ""

Try reconversion:
 % sfrac "hello world"
 % fracs 0.303788297767
 hello wormy

Oops... Maybe it has to do with tcl_precision?
 % set tcl_precision 17
 % sfrac "hello world"

But even at maximum precision, the tenth character cannot be fully reconstructed:
 % fracs 0.30378829776699118
 hello worlc

See also Mapping words to integers

Arts and crafts of Tcl-Tk programming