Page 1 sur 1

Séparer avec des espaces

Posté : 05 févr. 2010, 15:08
par Tiger
Bonjour, je cherche et j'essaie des choses depuis hier, mais je n'arrive pas à grand chose. Ce que je souhaite faire, c'est de prendre un numéro de carte de crédit et de lui ajouter des espacements à tous les 4 chiffres afin que ce soit plus lisible.
Ex : mon numéro ressemble à ça : 1234567890123456 et je voudrais avoir comme résultat : 1234 5678 9012 3456
J'ai essayé différentes fonctions php, j'ai fait des recherches, mais je trouve toujours pas comment faire.
Merci pour votre aide

Re: Séparer avec des espaces

Posté : 05 févr. 2010, 15:56
par niuxe
Hello,


Il y a d'autres solutions... En faisant simple, le petit modulo qui va bien :
$chaine = "1234567890123456";
$chaine_espace = "";
for($i = 0 ; $i <  strlen($chaine) ; $i++){
    $j = $i % 4;
    $chaine_espace .= $chaine[$i];
    if($j === 3){
        $chaine_espace .= "&nbsp;";
    }
}
echo $chaine_espace;
Bonne journée :)

Re: Séparer avec des espaces

Posté : 05 févr. 2010, 16:14
par stealth35
ou ca
	
$num = 1234567890123456;	
preg_match_all('/\d{4}/', $num, $matches);	
echo implode(' ', current($matches));

//1234 5678 9012 3456

Re: Séparer avec des espaces

Posté : 05 févr. 2010, 19:29
par AB
Oui effectivement, c'est un cas d'école pour l'utilisation des expressions régulières, ie particulièrement adapté dans le contexte.

Re: Séparer avec des espaces

Posté : 05 févr. 2010, 19:31
par Tiger
stealth35, ton code ne retourne pas le résultat au complet

niuxe, merci ça fonctionne parfaitement

Re: Séparer avec des espaces

Posté : 05 févr. 2010, 20:00
par stealth35
stealth35, ton code ne retourne pas le résultat au complet

niuxe, merci ça fonctionne parfaitement
étrange...

Re: Séparer avec des espaces

Posté : 05 févr. 2010, 21:38
par niuxe
stealth35, ton code ne retourne pas le résultat au complet
niuxe, merci ça fonctionne parfaitement
étrange...
Ton code fonctionne bien aussi. Car l'idée générale est bonne. Cependant, il y a une petite pétouille :
$num = "1234567890123456";
À noter que j'ai proposé une solution plus compréhensible et la plus simple qui soit (cf. mon commentaire en amont). J'ai pensé à une solution similaire à la tienne. :) Au passage, l'espace simple n'est peut être pas judicieux. N'oublie pas que l'espace insécable empêche un retour chariot sur une chaine.
Oui effectivement, c'est un cas d'école pour l'utilisation des expressions régulières, ie particulièrement adapté dans le contexte.
+1
Là, le code de stealth35 est plus rapide.

Tiger => pense à mettre le sujet résolu STP. :)

Bonne soirée

Re: Séparer avec des espaces

Posté : 05 févr. 2010, 22:18
par stealth35
$num = "1234567890123456";
marche tres bien sans les quotes chez moi, mais ta raison vos mieux les mettre, par contre je suis pas pour le coup de ton espace, parce que niveau portabilité c'est pas top (SQL, CLI...), et pour pasqu'une chiane soit coupé en HTML ca se gere avec le CSS

Re: Séparer avec des espaces

Posté : 06 févr. 2010, 06:35
par blof
Salut,

une autre façon :
<?php
$chaine = '1234567890123456';
$chaine = wordwrap($chaine, 4, ' ', 1);

echo $chaine;
?>

Re: Séparer avec des espaces

Posté : 06 févr. 2010, 07:04
par stealth35
Salut,

une autre façon :
<?php
$chaine = '1234567890123456';
$chaine = wordwrap($chaine, 4, ' ', 1);

echo $chaine;
?>
sans doute la meilleur solution :wink:

Re: Séparer avec des espaces

Posté : 06 févr. 2010, 21:18
par AB
À noter que j'ai proposé une solution plus compréhensible et la plus simple qui soit ...
Peut-être pas la plus simple, il faut déjà une bonne expérience pour y penser. Mais didactique c'est certain.

Pour faire plus simple (sans utiliser wordwrap) on pourrait faire ceci
$tab = array();
	
while($string != '')
{
$tab[] = substr($string,0,4);
$string = substr($string,4);	
}
	
$result = implode(' ',$tab);
L'avantage de cette solution (bien moins performante qu'une expression régulière ou qu'un wordwrap) est qu'elle est très facilement portable en utf-8 pour toute chaine de caractères y compris des caractères accentués :
	$tab = array();
	
	while($string != '')
	{
		$tab[] = mb_substr($string,0,4,'utf-8');
		$string = mb_substr($string,4,mb_strlen($string,'utf-8'),'utf-8');	
	}
	
	$result = implode(' ',$tab);
... mais il y a encore plus simple :
	$long = mb_strlen($string,'utf-8');
	
	$tab = array();
	
	for($i=0; $i < $long ; $i += 4)
	{
		$tab[] = mb_substr($string,$i,4,'utf-8');
	}
	
	$result = implode(' ',$tab);

A noter que pour faire toujours plus court on pourrait utiliser les fonctions des tableaux
$result = implode(' ',str_split($string, 4));
mais c'est sans intérêt réel par rapport à un wordwrap puisque str_split n'est pas non plus compatible utf-8;

C'est vrai que j'oublie souvent wordwrap car non compatible utf-8 mais il est vrai que dans le cas particulier de ce sujet puisqu'il ne s'agit que de chiffres, c'est encore le plus simple.