# -*- coding: iso-8859-1 -*-


zero="zéro"
chiffres=["un","deux","trois","quatre","cinq","six","sept","huit","neuf","dix","onze","douze","treize","quatorze","quinze","seize","dix-sept","dix-huit","dix-neuf"]
dizaines=["dix","vingt","trente","quarante","cinquante","soixante","","quatre-vingt"]
	
	
def CentainesDizaines(chiffre):
	
	""" traitement des centaines et dizaines : conversion en toutes lettres """
	
	resultat = ""
	Tstr = ""
	Reste = 0

	num = long(chiffre)
	Reste = num
	
	# traitment centaines
	if num >= 100:
		Tstr = chiffres[int(num / 100)-1]
		Reste = num % 100
		if Tstr == chiffres[0]:
			Tstr = "cent "
		else:
			Tstr += " cent "		
	# traitment dizaines
	if Reste <= 19 and Reste > 0:
	 	Tstr += chiffres[Reste-1]
	else:
	 	numD = long(Reste / 10) 	# dizaines
	 	numU = Reste % 10 		# unites
	 	
	 	if numD <= 5: Tstr += dizaines[numD-1]
	 	elif numD in [6,7]: Tstr += dizaines[5]	# cas spécial soixante et soixante-dix		 	
	 	elif numD in [8,9]: Tstr += dizaines[7]	# cas spécial quatre-vingt et quatre-vingt-dix		 	
	 	
	 	# conjonctions
	 	if numU==1 and numD < 8: Tstr += " et "		 	
	 	elif numU!=0 or numD in [7,9]: Tstr += "-"
	 	
	 	if numD in [7,9]: numU += 10  # cas special pour soixante-dix et quatre-vingt-dix
	 	if numU!=0: Tstr += chiffres[numU-1]
	 
	resultat = Tstr.strip()
	 		
	return resultat
	

def ChiffreEnLettres(chiffre=0,capitalize=True,label="Euros"):
	
	"""
	    ############
	    ## crée par Ju² : julien@bouquillon.com depuis des sources VB
	    ############
	    
	    Algo basique de conversion chiffres en lettres... a optimiser 
	    convertit un chiffre entier ou decimal en chaine de caractères en pure francais
	    chiffre : chiffre entier ou decimal à fournir.
	    capitalize : si on doit capitaliser le resultat ou pas.
	    label : le nom des unités s'il faut en ajouter un autre que Euros (pas géré dans la capitalisation).
	"""

	resultat = ""
	
	if str(chiffre).find(".")>0:
		# arrondis pour les decimales si besoin
		arrDec=str(chiffre).split(".")
		centimes = int(arrDec[1][0:2])
		if len(arrDec[1])>2:
			arrondi=int(arrDec[1][2])
			if arrondi>5: centimes+=1
		return "%s et %s" % (ChiffreEnLettres(arrDec[0]),ChiffreEnLettres(centimes,capitalize=False,label="centimes"))
		
	num = long(chiffre)
	
	# verifications
	if num == 0:
		return zero
	elif num > 999999999999:
		return "Nombre trop grand"
	
	# traitement milliards
	milliards=num/1000000000
	if milliards > 0:
		print milliards
		nbmilliards = CentainesDizaines(milliards)
		resultat = nbmilliards + " milliard"
		if nbmilliards != chiffres[0]:
			resultat+="s "
				
	# traitement millions
	millions = num % 1000000000
	millions = millions/1000000
	if millions > 0:
		nbmillions = CentainesDizaines(millions)
		resultat += nbmillions + " million"
		if nbmillions != chiffres[0]:
			resultat+="s "

	# milliers
	milliers = num % 1000000
	milliers = milliers/1000 
	if milliers > 0:
		nbmilliers = CentainesDizaines(milliers)
		if nbmilliers != chiffres[0]:
			resultat += "%s" %nbmilliers 
		resultat += " mille "
	
	# centaines et dizaines
	unites = num % 1000
	if unites > 0:
		nbunites  = CentainesDizaines(unites ) 
		resultat += "%s" % nbunites  

	# Presentation
	resultat = resultat.strip()
	
	if capitalize:
		resultat=resultat.capitalize()
		
	resultat += " %s" % label
	 		
	return resultat



if __name__=="__main__":
	# petits tests entre amis	
	import random
	
	for i in range(100):
		rnum = random.randint(0,1000000000)
		print "%s : %s" % (rnum,ChiffreEnLettres(rnum)	)
		
	print "%s : %s" % (999999999,ChiffreEnLettres(999999999)	)
	print "%s : %s" % (0,ChiffreEnLettres(0)	)
	
	print "%s : %s" % (999999999999,ChiffreEnLettres(999999999999)	)
	
	print "%s : %s" % (42.75465436,ChiffreEnLettres(42.75465436)	)
 
