Accueil > Développement web > Les pages dynamiques avec PHP/MySQL > Exemples de fonctions PHP > Transformer un nombre (entier naturel) en sa description textuelle
4551 visites

Transformer un nombre (entier naturel) en sa description textuelle

dimanche 1er juillet 2018 (), par Vader[FR]

// transforme un nombre en sa description textuelle
function num2txt($num){
	$res=($num<0)?"moins":"";
	$tabchiffres=array("","un","deux","trois","quatre","cinq","six","sept","huit","neuf"); 	// commence à zéro !
	$tabdix=array("","onze","douze","treize","quatorze","quinze","seize");			// idem
	$tabdizaines=array("","dix","vingt","trente","quarante","cinquante","soixante");	// idem
	$trnum=number_format($num); // pas de partie décimale, une , entre chaque millier
	$tabnum=explode(",",$trnum);
	$puiss=count($tabnum); // 1 = entre 0 et 999, 2 = entre 1000 et 999 999 milliers, 3 = entre 1 000 000 et 999 999 999 milions, 4 =...
	$tabpuis=array("","","mille","million","milliard"); // centaine/dizaine de milliards, centaine/dizaine de million, centaine/dizaine de millier, centaine/dizaine/unité
	foreach ($tabnum as $milnum){
		$taillenum=strlen($milnum);
		$res.=($res!="")?" ":"";
		$verrounite=false;
		if ($taillenum==3) { // si 3 chiffres, traiter centaines
			// si 0 = rien, sinon x cent(s)
			if ($milnum[0]==1){
				$res.="cent";
			}
			if ($milnum[0]>1){
				$res.=$tabchiffres[$milnum[0]]." cent";
				$res.=(($milnum[1]>0)||($milnum[2]>0)||($puiss>=2))?"s":"";
			}
		}
		if ($taillenum>=2) { // si 2 chiffres, traiter dizaines
			$pos=($taillenum==3)?1:0;
			$res.=($res!="")?" ":"";
			//$res.=($pos!=0)?" ":"";
			$next=$pos+1;
			// si 1 
			if ($milnum[$pos]==1){
				if (($milnum[$next]>=1)&&($milnum[$next]<=6)){ 
					// onze à seize
					$res.=$tabdix[$milnum[$next]];
					$verrounite=true;
				}else{
					// 0 +	si 7 à 9 = dix-
					$res.=$tabdizaines[1];
					$res.=($milnum[$next]>=7)?"-":"";
				}
			}
			// si 2 à 6
			if (($milnum[$pos]>1)&&($milnum[$pos]<7)){
				$res.=$tabdizaines[$milnum[$pos]];
				$res.=($milnum[$next]>0)?"-":"";
			}
			// si 7, 8 et 9 qui utilisent aussi le chiffre des unités
			if ($milnum[$pos]==7){
				$res.="soixante";
				if ($milnum[$next]==0){ $res.="-dix"; }
				if ($milnum[$next]==1){ $res.=" et onze"; }
				if (($milnum[$next]>=2)&&($milnum[$next]<=6)){ $res.="-".$tabdix[$milnum[$next]]; }
				if ($milnum[$next]>=7){ $res.="-dix-".$tabchiffres[$milnum[$next]]; }
				$verrounite=true;
			}
			if ($milnum[$pos]==8){
				//$verrounite=true;
				$res.="quatre-vingt";
				if ($milnum[$next]>1){ $res.="-"; }
			}
			if ($milnum[$pos]==9){
				$res.="quatre-vingt";
				if ($milnum[$next]==0){ $res.="-dix"; }
				if (($milnum[$next]>=1)&&($milnum[$next]<=6)){ $res.="-".$tabdix[$milnum[$next]]; }
				if ($milnum[$next]>=7){ $res.="-dix-".$tabchiffres[$milnum[$next]]; }
				$verrounite=true;
			}
		}
		if ($taillenum>=1) { // si 1 chiffres
			$pos=$taillenum-1; // dernier chiffre 2-1 = 1 ? 3-1=2
			if ($pos==0){
				// 1 seul chiffre, donc si >1 ou 1 et puiss = 1, afficher le chiffre
				$res.=(($milnum>1)||(($milnum==1)&&($puiss==1)))?$tabchiffres[$milnum]:"";
			}else{	
				if ((!$verrounite)&&($milnum[$pos]!=0)){ // si chiffre dizaine != 7, 8 ou 9
					$pre=$pos-1;
					if ($milnum[$pre]==0){
						$res.=$tabchiffres[$milnum[$pos]];
					}
					// si dizaine
					if ($milnum[$pre]==1){
						// déjà un tiret 
						$res.=$tabchiffres[$milnum[$pos]];
					}
					// si vingt à 60 ou 80, et 1, mettre x et 1
					if (((($milnum[$pre]>=2)&&($milnum[$pre]<=6))||($milnum[$pre]==8))&&($milnum[$pos]==1)){
						$res.="et-".$tabchiffres[$milnum[$pos]];
					}
					// si vingt à 60 ou 80 et pas 1
					if (((($milnum[$pre]>=2)&&($milnum[$pre]<=6))||($milnum[$pre]==8))&&($milnum[$pos]!=1)){
						$res.=$tabchiffres[$milnum[$pos]];
					}
				}
			}
		}
		// si total>1, mettre le tabpuiss[puiss]
		if (($milnum>=1)&&($tabpuis[$puiss]!="")){
			$res.=($res!="")?" ":"";
			$res.=$tabpuis[$puiss]; // mille est invariable
			// mais million, non
			$res.=(($puiss==3)&&($milnum>1))?"s":"";
		}
		$puiss--;
	}
	if ($num==0){
		$res="zéro";	
	}
	return $res;
}

Répondre à cet article

Total 397331 visites depuis 4463 jours | | SPIP | | Plan du site | Suivre la vie du site RSS 2.0
()