Bonjour,

J'ai une table nommé bd_ath contenue dans ma BDD bd_ixi. Cette table contient des chiffres sous le format Bigint comme "5687489521890". Je souhaite lors de l'appel via "SELECT * FROM..." de cette table que chaque chiffre soient séparés par des espaces de la sorte "5 68 74 89 521 890" et je ne souhaite pas qu'ils soient formaté de la sorte dans ma table ( je précise pour ceux qui auraient pensé à cette solution :) ).

J'ai trouvé ceci sur php manuel number_format: mais je n'ai pas trouvé la solution à mon problème

<?php 
$org_num = "255173029255255255"; 
echo "<br>org: ".$org_num; 
echo "<br>".number_format($org_num); 
?> 
returns: 
org: 255173029255255255 
255,173,029,255,255,264

Car il s'agit pas d'insertion d'espace après le premier chiffre après le 3em après le 5em .

Quelqu'un a une solution ?

20 réponses


bah comment il fonctionnent alors les espaces ? c'est aléatoire ? il est structuré ce nombre, chacun veut dire quelque chose ? parce que si une fois c'est 5 68 74... un autre 56 874... encore une autre 568 7 4 ... (j'ai pris la meme série mais c'est pour l'idée) ca va etre tendu je pense ^^

KTC
Auteur

c'est toujours le même format d'espacement exemple "5 86 78 95 562 354"

et bien tu comptes les chiffres, tu insere l'espace et tu comptes combien de chiffres tu as passé pour savoir combien de chiffres il faut entre les espaces ;)

KTC
Auteur

ok ça c'est bon mais c'est la méthode à utiliser pour inserer les espacement qu'il me manque

ha ok, bah dans une autre variable ?
tu parcours ta premiere variable et tu la recopies, quand il faut insérer un espace, tu l'insère puis ton continue à copier coller, il faut un espace ? tu l'insere, tu continues à copier coller...
et tu retournes ta variable dans la quelle tu as copié, simple non ? :D

Re Hello :)

J'ai vu ça sur un fofo concernant l'utilisation des RegEx :

$telephone_formate = preg_replace("#(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})#", "$1 $2 $3 $4 $5", $telephone);

ça formate le numéro de telephone de 10 chiffres collés en 10 chiffres formatés, faut juste adapter :)

Source originale :
Forum de base

moi je ferai un truc du genre :

<?php
  $spacePosition = array(1,3,5,7,10); // ce tableau signifie le placement des espaces : On met un espace avant le caractère numéro 1, avant le numéro 3, ... etc. - sachant que le premier caractère est le caractère numéro 0 !
  $nbre = 5687489521890;
  $split = str_split($nbre);
  $out = '';
  for(i=0;i<=count($split);i++){
    if(in_array($i,$spacePosition)){ $out .= ' '; }
    $out .= $split$i];
  }
  echo $nbre . ' devient ' . $out . ' :-)';
?>

Je viens d'écrire ça en vitesse, il faudrait le tester et l'améliorer. Mais je pense que l'idée est là !

BD

@dutbas : pas con non plus :)

$iMyNumber = 5687489521890;
    $sMyNumber = preg_replace( '/^(\d{1})(\d{2})(\d{2})(\d{2})(\d{3})(\d{3})$/', '$1 $2 $3 $4 $5 $6', strval( $iMyNumber ) );

Comme ça, ça marche, et ça ne prends qu'une ligne, c'est plus joli. :)

oui, c'est vrai, ... mais j'ai des problèmes avec les regex !
Même si ça parait logique quand on lit ta ligne ...

Les regex, c'est probablement un des trucs les plus puissants et le plus méconnu des devs de tout poils...
Alors que dans le fond, c'est simple comme choux.
Un site formidable pour tester en live ses regex, c'est rubular.com. Je l'ai d'ailleurs utilisé vite fait pour voir si la regex que je donnais de tête était pas malfoutue...

Merci pour ce lien :-)

Pis, j'en profite pour rajouter ce lien, c'est une bibliothèque de RegEx assez complète :)

RegexLib.com

Pour les personnes qui n’apprécie pas les regexs, c'est possible mais c'est plus long:

<?php
$number = '568748';
$number = $number[0].' '.$number[1].''.$number[2].' '.$number[3].''.$number[4].' '.$number[5].''.$number[6];
echo $number;
?>

ou tout simplement :

$num = '0123456789';
echo wordwrap($num, 2, ' ', true);
// Affiche: 01 23 45 67 89
OU
echo wordwrap($num, 2, '-', true);
// Affiche: 01-23-45-67-89
ETC ...

Mikachu > oui sauf que ça ne va pas trop dans l'idée de cocochannel, la répartition des chiffres n'est pas égale...
Wilose > c'est plus long, certes, mais je pense qu'en bench, cette méthode est plus rapide que les regex, mais dans le cas présent uniquement.
Les regex, c'est bien, mangez-en !

Exact, j'avias mal lu son problème. Je pensais qu il cherchait a séparé par des espaces tous les x chiffres.

Dans ce cas la il y a cette solution je penses a froid, qui aufinal se rapproche de toi wilose :) :

$num = '5687489521890';
// string substr ( string $string , int $start , int $length ] );
echo substr($num, 0,1).' '.substr($num, 1,2).' '.substr($num, 3,2).' '.substr($num, 5,2).' '.substr($num, 7,3).' '.substr($num, 10,3);

Seul hic : ceci fonctionne parfaitement bien pour un affichage mais si on veut mettre ceci dans un WHERE il faut incrementé de 1 chaque premier chiffre de la fonction substr (j'ai rencontré ce soucis...)

Salut, lors de l'affichage, utilise la fonction php number_format

Par exemple :

<?php 
$chiffre = 132456789;
echo number_format($chiffre, 0, ',', ' ')." €";
?>

ça va donner ça : 132 456 789 €
<br />
Dans la doc PHP tu as les explications pour paramétrer ça !

@zvetlania :
il veut sous ce format: "5 68 74 89 521 890"
1 chiffre 3x2chiffres 2x3 chiffres

[mode type="boudeur"]
Je continue à dire que les Regex, c'est mieux.
[/mode]

:D