# 8 Conversion de types

# Exercice

# Écrire la fonction convertir(S) qui convertit son paramètre (un string) 
# en un entier. Pour que la conversion soit possible, le paramètre S doit 
# être être composé de chiffres éventuellement précédé d'un signe.

def convertir(S) : # S est une liste de caractères

    # Il y a un signe au début ou pas ?
    signe= +1                                         # Initialisation du signe
    if S[0:1] in '+-':
        if S[0:1]=='-' : signe=-1
        S = S[1:]                                        # On enlève le signe

    if S.isdigit(): return int(S) * signe             # On peut aussi écrire : str.isdigit(xs) !
    else: return (S + " n'est pas un nombre")

S=input('Donner  une chaine de chiffres: ')
print(convertir(S))

# Donner  une chaine de chiffres: -124
# -124
# Donner  une chaine de chiffres: 12a

#  Une version qui n'utilise ni int() ni isdigit()
def convertir02(S1) :       # S est une liste de caractères
    assert(S1 != '' and S1 != None)
    signe= +1                                       # Initialisation du signe
    val = 0; S=S1
    if S[0] in '+-':
        if S[0:1]=='-' : signe=-1
        S = S[1:]
    for car in S :
        if car in "0123456789": val = 10*val+ord(car)-ord('0')
        else : return (S1 + " n'est pas un nombre")
    return val * signe             # On peut aussi écrire : str.isdigit(xs) !

S=input('Donner  une chaine de chiffres : ')
print(convertir02(S))

# Exercice
# Écrire la fonction {\tt convertir2r(S)} qui convertit son paramètre (un 
# string) en un réel (loat). Pour que la conversion soit possible, le
# paramètre {\it S} doit être être éventuellement précédé d'un signe, puis 
# composé de chiffres suivis d'un '.' puis une série de chiffres. La
# présence d'un '.' est obligatoire, et qui est forcément suivi d'au moins
# un chiffre.

def convertir2r(S) :                       # S est une liste de caractères
    assert('.' in S)                        # '.' obligatoire
    lst_2_parties=S.split('.')              # une liste des 2 parties
    val_int=0
    if lst_2_parties[0] != '' : val_int=convertir02(lst_2_parties[0])
        
    # vérifier que la partie décimale ne comporte  pas un second signe !
    assert(lst_2_parties[1][0] not in '+-')

    val_reel=0
    if lst_2_parties[1] != '' : val_reel=convertir02(lst_2_parties[1])

    # La partie décimale s'ajoute ou se retrache suivant le signe de val_int'
    if val_int >= 0 :
        return val_int + val_reel/(10**len(lst_2_parties[1]))
    else : return val_int - val_reel/(10**len(lst_2_parties[1]))


S=input('Donner  une chaine de chiffres (un réel) : ')
print(convertir2r(S))
convertir2r('12.34')
convertir2r('0.12')
convertir2r('13.0')
convertir2r('-3.001')