Float State Diagram

Sample of Float Strings

0.123
-0.123
+0.123
.123
-.123
+.123
-123.E4
+123.E4
.123e4
123.456
-123.456
+123.456
.123e-4
-.123e-4
+.123e+4
123.456E-7
-123.456E+7
+123.456e+7

State Diagram

image missing

In the above diagram:

DIGITthe characters "0" thru "9"
Eethe character "E" or "e"
EOSend of string
PERIODthe period character (".")
SIGNthe character "+" or "-"

Note: The starting and ending spaces have been removed from the string.

Python Code - Parse a Float String

# ==========================================================
# Test String to Float Conversion
# ----------------------------------------------------------
# This is not the most efficient code. I designed it as
# a demonstration. It could be more efficient.
# ----------------------------------------------------------
# Note: In this code the exponent must be an integer.
#       The pow() function can take a float.
# ==========================================================

# ----------------------------------------------------------
# global variables
# ----------------------------------------------------------

e  = 0                 # string's exponent value
ep = True              # exponent is positive
f  = 0.0               # string's fraction value
i  = 0                 # string character index
l  = 0                 # string length
n  = 0.0               # string's number value
np = True              # number is positive
v  = 0.0               # string's float value

# ----------------------------------------------------------
# convert a string to float
# float conversion results is in global v
# ----------------------------------------------------------

def StringToFloat(str):
 
    global e,ep,f,i,l,n,np,v

    # --- initialize

    e  = 0
    ep = True
    f  = 0.0
    i  = 0
    l  = len(str)
    n  = 0.0
    np = True
    v  = 0.0

    # --- process string number

    print('GetNumber({}) i={}'.format(str,i))

    if l < 1:
        return False
    if not GetNumber(str):
        return False

    # --- process string fraction

    print('GetFraction({}) i={}'.format(str,i))

    if i < l:
        if not GetFraction(str):
            return False

    # --- process string exponent

    print('GetExponent({}) i={}'.format(str,i))

    if i < l:
        if not GetExponent(str):
            return False

    # --- calculate float value

    nf = n + f                   # number + fraction

    if not np:                   # negative value?
        nf = -nf

    if not ep:                   # negative exponent?
        e = -e   

    print('n={},f={},nf={},e={}'.format(n,f,nf,e))

    if e == 0:
        v = nf
    else:
        v = pow(nf,e)

    return True                  # success

# ----------------------------------------------------------
# get number part of float
# ----------------------------------------------------------

def GetNumber(str):

    global i,l,n,np

    sign = False                 # found a [+-] character

    while i < l:

        c = str[i]               # get a string character
        print("c={},n={},i={}".format(c,n,i))
        i = i + 1                # increment string index

        if c == "+":             # character "+"
            if sign:             # found more that one sign?
                return False     # error
            sign = True          # found + sign

        elif c ==  "-":          # character "-"
            if sign:             # found more that one sign?
                return False     # error
            sign = True          # found - sign
            np = False           # number is negative

        elif c == ".":           # character "."
            return True
        elif c ==  "0":          # character "0"
            n = n*10.0
        elif c ==  "1":          # character "1"
            n = (n*10.0) + 1.0
        elif c ==  "2":          # character "2"
            n = (n*10.0) + 2.0
        elif c ==  "3":          # character "3"
            n = (n*10.0) + 3.0
        elif c ==  "4":          # character "4"
            n = (n*10.0) + 4.0
        elif c ==  "5":          # character "5"
            n = (n*10.0) + 5.0
        elif c ==  "6":          # character "6"
            n = (n*10.0) + 6.0
        elif c ==  "7":          # character "7"
            n = (n*10.0) + 7.0
        elif c ==  "8":          # character "8"
            n = (n*10.0) + 8.0
        elif c ==  "9":          # character "9"
            n = (n*10.0) + 9.0
        else:                    # illegal character
            return False

    return True                  # end of string

# ----------------------------------------------------------
# get fraction part of float
# ----------------------------------------------------------

def GetFraction(str):

    global i,f

    x = 0.1                      # decimal place factor      

    while i < l:

        c = str[i]               # get string character
        print("c={},f={},i={},x={}".format(c,f,i,x)) 
        i = i + 1                # increment string index

        if c == "E" or c == "e": # found exponent?
            return True          # yes

        if c ==  "1":            # character "1"
            f = f + (1.0*x)
        elif c ==  "2":          # character "2"
            f = f + (2.0*x)
        elif c ==  "3":          # character "3"
            f = f + (3.0*x)
        elif c ==  "4":          # character "4"
            f = f + (4.0*x)
        elif c ==  "5":          # character "5"
            f = f + (5.0*x)
        elif c ==  "6":          # character "6"
            f = f + (6.0*x)
        elif c ==  "7":          # character "7"
            f = f + (7.0*x)
        elif c ==  "8":          # character "8"
            f = f + (8.0*x)
        elif c ==  "9":          # character "9"
            f = f + (9.0*x)
        else:                    # illegal character
             return False

        x = x * 0.1              # decimal place factor

    return True                  # end of string


# ----------------------------------------------------------
# get exponent part of float
# ----------------------------------------------------------

def GetExponent(str):

    global i,e,ep

    e = 0                        # initialize exponent to 0
    sign = False                 # found a [+-] character

    while i < l:

        c = str[i]               # get string character
        print('c={},e={},i={}'.format(c,e,i))
        i = i + 1                # increment string index

        if c == "+":             # character "+"
            if sign:             # found more that one sign?
                return False     # error
            sign = True          # found + sign

        elif c ==  "-":          # character "-"
            if sign:             # found more that one sign?
                return False     # error
            sign = True          # found - sign
            ep = False           # exponent is negative

        elif c ==  "0":          # character "0"
            e = e*10
        elif c ==  "1":          # character "1"
            e = (e*10) + 1
        elif c ==  "2":          # character "2"
            e = (e*10) + 2
        elif c ==  "3":          # character "3"
            e = (e*10) + 3
        elif c ==  "4":          # character "4"
            e = (e*10) + 4
        elif c ==  "5":          # character "5"
            e = (e*10) + 5
        elif c ==  "6":          # character "6"
            e = (e*10) + 6
        elif c ==  "7":          # character "7"
            e = (e*10) + 7
        elif c ==  "8":          # character "8"
            e = (e*10) + 8
        elif c ==  "9":          # character "9"
            e = (e*10) + 9
        else:                    # illegal character
            return False

    return True                  # end of string

# ---------------------------------------------------------
# main
# ---------------------------------------------------------

if __name__ == '__main__':

    # --- python version function -------------------------

    import sys

    def RunningPython3():
        ##print(sys.version_info)
        if sys.version_info[0] == 3:
            return True
        return False

    # --- get use input function --------------------------

    def GetUserInput(prompt,py3):
        if py3:
            return input(prompt)
        else:
            return raw_input(prompt)

    # --- pause the program function ----------------------

    def Pause(py3):
        GetUserInput('\nPress enter to continue ',py3)

    # --- ask the user for input --------------------------

    py3 = RunningPython3()

    while True:

        s = GetUserInput('\nEnter float number: ',py3)

        s = s.strip()     # remove leading/trailing spaces

        if s == '':       # empty string?
            break

        if StringToFloat(s):
            print('Got Value {}'.format(v))
        else:
            print('Oops! an error')

        Pause(py3)