Transformer un int en String d'une taille spécifique

Transformer un int en String d'une taille spécifique - Java - Programmation

Marsh Posté le 08-11-2004 à 15:45:31    

J'ai besoin de transformer un int en String, mais avec une taille de la String bien précise.
par exemple
formatString(22, 6) 22 = data a transformer, 6= taille de la String
donnerait "000022"
et formatString(4057, 5) "04057"
 
Une idée ?
Tkx


Message édité par aurel le 08-11-2004 à 15:48:39
Reply

Marsh Posté le 08-11-2004 à 15:45:31   

Reply

Marsh Posté le 08-11-2004 à 15:59:38    

trouvé :o

Reply

Marsh Posté le 08-11-2004 à 16:00:53    

n'explique pas hein [:moule_bite]

Reply

Marsh Posté le 08-11-2004 à 17:27:29    

aurel a écrit :

J'ai besoin de transformer un int en String, mais avec une taille de la String bien précise.
par exemple
formatString(22, 6) 22 = data a transformer, 6= taille de la String
donnerait "000022"
et formatString(4057, 5) "04057"
 
Une idée ?
Tkx


 
essaie ce code pour voir (je n'ai pas testé)
 

Code :
  1. public String formatString(int data, int len){
  2. String s =""+data;
  3. int l=s.length();
  4. int diff=len-l;
  5. for(int i=0; i<diff;i++){
  6. s="0"+s;
  7. }
  8. return s;
  9. }


 
cet algo suppose que la longueur de la chaine a formater est toujours inférieure a la longueur spécifiee et de ce fait ne traite pas le cas ou la longueur de la chaine à transformer est superieure a la longuer spécifier.
je n'ai pas testé mais ça ne doit pas etre loin de ça
 


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
Reply

Marsh Posté le 08-11-2004 à 17:58:01    

Citation :

s="0"+s;


[:fear]

Reply

Marsh Posté le 08-11-2004 à 18:08:30    

ça marche pas ce truc là ou quoi
j'ai pas testé mais je pensais que la concatenation pouvait se faire directemenet sans avoir a creer un string.
 
 :??:  :??:  :??:  :??:  :??:  :??:  


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
Reply

Marsh Posté le 08-11-2004 à 18:21:08    

axk47 a écrit :

ça marche pas ce truc là ou quoi
j'ai pas testé mais je pensais que la concatenation pouvait se faire directemenet sans avoir a creer un string.


Ca dans une boucle, c'est moins qu'optimal.  :sweat:


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 08-11-2004 à 18:30:05    

ouep, il vaut bien mieux utiliser StringBuffer ou StringBuilder si tu es déjà passé en java1.5

Reply

Marsh Posté le 08-11-2004 à 23:10:29    

NumberFormat ..


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-11-2004 à 00:20:32    

ouais mais là c'est trop facile  :pfff:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 09-11-2004 à 00:20:32   

Reply

Marsh Posté le 09-11-2004 à 00:23:55    

[:joce]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-11-2004 à 09:45:59    

sircam a écrit :

Ca dans une boucle, c'est moins qu'optimal.  :sweat:


 
ouai mais il cherche une idée. Il n'a précisé qu'il voulait une solution optimale.
mais toi comment tu fais. :??:  :??:  
tu preferes une  version recursive peut etre qui je trouve moins optimale que celle itérative!  ;)  
 
 


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
Reply

Marsh Posté le 09-11-2004 à 09:59:58    

mais nan, c'est juste qu'il faut jamais utilser la concaténation de chaines dans une boucle. Ca créé plein d'objets inutiles !


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 09-11-2004 à 10:02:55    

Oui, c'est pas parce qu'on a pas demandé une version optimale qui faut sortir un truc... pas très optimal. Disons qu'il est de bonne pratique d'éviter des concaténations de chaînes dans des boucles.
 
Sinon, la prochaine fois qu'on me demande une méthode de tri sans autres précisions, je réponds random sort :)


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 09-11-2004 à 10:26:44    

benou a écrit :

mais nan, c'est juste qu'il faut jamais utilser la concaténation de chaines dans une boucle. Ca créé plein d'objets inutiles !


 
merci benou je me souviendrai le jour où j'aurai besoin d'écrire du code optimisé.
 :jap:  :jap:


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
Reply

Marsh Posté le 09-11-2004 à 10:46:52    

benou a écrit :

mais nan, c'est juste qu'il faut jamais utilser la concaténation de chaines dans une boucle. Ca créé plein d'objets inutiles !

bah, encore, les chaines c'est loin d'etre le pire:o tu connais pas Les Dessous Des Strings toi :o

Reply

Marsh Posté le 09-11-2004 à 17:18:55    

the real moins moins a écrit :

bah, encore, les chaines c'est loin d'etre le pire:o tu connais pas Les Dessous Des Strings toi :o


si ...  :heink:  merci ...  :heink:  
 
y a une vanne que je comprends pas  :??:

Reply

Marsh Posté le 09-11-2004 à 17:19:46    

axk47 a écrit :

merci benou je me souviendrai le jour où j'aurai besoin d'écrire du code optimisé.
 :jap:  :jap:


rien à voir avec du code optimal ! le truc que tu fais sur des boucles un peu longue, ca te détruit complétement tes perfs ! fait le test toi même ...

Reply

Marsh Posté le 09-11-2004 à 17:20:01    

ben non [:spamafote]
mais c'est moins "grave" pour des String que pour des objets mutables qui n'ont pas ce machin de sharing qu'ont les String

Reply

Marsh Posté le 09-11-2004 à 18:07:47    

D'ailleurs, y a t-il d'autres classes que les String qui sont immutables ?

Reply

Marsh Posté le 09-11-2004 à 18:11:38    

oui.
 
genre les Integer

Reply

Marsh Posté le 09-11-2004 à 19:09:32    

the real moins moins a écrit :

ben non [:spamafote]
mais c'est moins "grave" pour des String que pour des objets mutables qui n'ont pas ce machin de sharing qu'ont les String


ha ouais ? et sur quel autre objet tu peux utiliser l'opérateur '+' ?  :heink:

Reply

Marsh Posté le 09-11-2004 à 19:22:20    

bon, j'admets, j'ai pas suivi. [:djmb]
(ct juste pour relever que "creer" des instances de string, c'etait pê moins mortel que creer des instances d'autre chose :whistle:)

Reply

Marsh Posté le 09-11-2004 à 19:27:55    

the real moins moins a écrit :

bon, j'admets, j'ai pas suivi. [:djmb]
(ct juste pour relever que "creer" des instances de string, c'etait pê moins mortel que creer des instances d'autre chose :whistle:)


t'as voulu faire le kéké, ouais  :sarcastic:  
 
et ca dépend de la façon dont elle est crée ...
en l'occurence, là c'est des chaines qui sont appendées dans un StringBuffer => le cache String et le partage de tableau de chars ne s'appliquent pas ...


Message édité par benou le 09-11-2004 à 19:29:05
Reply

Marsh Posté le 09-11-2004 à 20:05:06    

Minute, ce truc de '+' avec les Sting, ça confine au cas pathologique. Un relent de surcharge d'opérateur. C'est assez malsain.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 09-11-2004 à 20:39:12    

Je pense qu'on peut encore optimiser la solution suivante

Code :
  1. String formatString(int data, int len){
  2.     String s = String.valueOf(data);
  3.     int l = s.length();
  4.     int diff = len-l;
  5.     char [] zeros = new char[diff];
  6.    
  7.     for(int i=0; i<diff;i++){
  8.       zeros[i] = '0';
  9.     }
  10.    
  11.     StringBuffer sb = new StringBuffer(len);
  12.     sb.append(zeros);
  13.     sb.append(s);
  14.     return sb.toString();
  15.   }


Message édité par phnatomass le 09-11-2004 à 20:42:46
Reply

Marsh Posté le 09-11-2004 à 20:44:41    

2 problèmes:  
  1. quid si diff<=0 ?
  2. Ton tableau "zeros" ne sert à rien, tu peux directement faire des appends de char sur le StringBuffer, ça ira aussi vite à mon humble avis.

Reply

Marsh Posté le 09-11-2004 à 20:56:32    

sircam a écrit :

Minute, ce truc de '+' avec les Sting, ça confine au cas pathologique. Un relent de surcharge d'opérateur. C'est assez malsain.


 :??: c'est à dire ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 10-11-2004 à 10:52:51    

Lam's a écrit :

2 problèmes:  
  1. quid si diff<=0 ?


Oui. Il est vrai qu'au début de toute méthode, il y a des tests a efféctué sur les arguments.

Lam's a écrit :


  2. Ton tableau "zeros" ne sert à rien, tu peux directement faire des appends de char sur le StringBuffer, ça ira aussi vite à mon humble avis.


Presque vrai concernant la vitesse mais à cause justement des tests d'arguments effectués par la méthode append c'est moins rapide.
On chipote  ;)


Message édité par phnatomass le 10-11-2004 à 10:54:31
Reply

Marsh Posté le 10-11-2004 à 10:56:25    

phnatomass a écrit :

Presque vrai concernant la vitesse mais à cause justement des tests d'arguments effectués par la méthode append c'est moins rapide.


 
 :??: De quels tests tu parles ?

Reply

Marsh Posté le 10-11-2004 à 11:17:12    

Une vieille méthode que j'avais faite, qui m'a pas mal servit (convertir l'entier en String avant tout) :

Code :
  1. /**
  2.      * Rend une copie de la chaine <code>_string</code>, mise à la taille passée en paramètre. Si la longueur de cette
  3.      * chaine est inférieure à la taille souhaitée, autant d'occurences que nécessaires sont ajoutés sur la gauche de
  4.      * la valeur passée en paramètre. Si la longueur est inférieure, la chaine est tronquée par la gauche (les caractères
  5.      * les plus à gauche sont ceux supprimés en 1er).
  6.      * @param _string Chaine en entrée
  7.      * @param _iLength longueur de la chaine de sortie
  8.      * @param _cForComplete caractère par lequel complèter la chaine entrée (si nécessaire)
  9.      * @return chaine modifiée
  10.      */
  11.     public static String CompleteByTheLeft (String _string, int _iLength, char _cForComplete)
  12.     {
  13.         if (_string == null)
  14.             return (null);
  15.         int iNbCharsToAdd   = _iLength - _string.length();
  16.         int i = 0;
  17.         // Si on ne doit pas complèter la chaine, mais la tronquer
  18.         if (iNbCharsToAdd < 0)
  19.             return (_string.substring(-iNbCharsToAdd, _string.length()));
  20.         char[] buf          = new char[_iLength];
  21.         for (; i < iNbCharsToAdd; i++)
  22.             buf[i] = _cForComplete;
  23.         for (; (i < buf.length) && (i-iNbCharsToAdd) < _string.length(); i++)
  24.             buf[i] = _string.charAt(i-iNbCharsToAdd);
  25.         return (new String (buf));
  26.     }


Message édité par El_gringo le 10-11-2004 à 11:17:46
Reply

Marsh Posté le 10-11-2004 à 11:39:09    

c'est quoi cette convention de nommage [:psychokwak]

Reply

Marsh Posté le 10-11-2004 à 11:40:01    

y a un melange de hongrois et autre chose [:paysan]


---------------
IVG en france
Reply

Marsh Posté le 10-11-2004 à 11:44:58    

hongrois !? J'en sais rien moi. C'est simplement : préfixer les paramètres par un _ , puis le type (s'il s'agit d'un type primaire). C'est si incroyable que ça !?

Reply

Marsh Posté le 10-11-2004 à 11:45:28    

et la methode avec une majuscule, et les for (; illisibles, et j'en passe :o
 
(en plus l'optimisation bidon des for (; aurait été avantageusement remplacée par un int length = _string.length() que tu appelles à chaque passage de ta boucle [:itm])


Message édité par the real moins moins le 10-11-2004 à 11:46:45
Reply

Marsh Posté le 10-11-2004 à 11:50:57    

Tu pinailles. Franchement, on s'en contrefou. Une méthode aussi simple que ça, tout le monde est capable de la comprendre j'crois. L'important là, c'est la finalité, c'est tout.
 
EDIT : et puis _string.length(), ça ne fait que rendre un entier, alors niveau optimisation, c'est franchement négligable.


Message édité par El_gringo le 10-11-2004 à 11:54:07
Reply

Marsh Posté le 10-11-2004 à 11:57:36    

non, mais dans mon cas, je parlais de la notation hongroise, t'enerve pas [:joce]
 
http://www.alaide.com/dico.php?q=n [...] se&ix=3960


---------------
IVG en france
Reply

Marsh Posté le 10-11-2004 à 11:59:28    

C'est pas par rapport à ce que t'as dit que je m'énerve. C'est l'autre -- qui casse les c...


Message édité par El_gringo le 10-11-2004 à 12:00:13
Reply

Marsh Posté le 10-11-2004 à 12:26:36    

Lam's a écrit :

:??: De quels tests tu parles ?


Des tests de validité des arguments

Reply

Marsh Posté le 10-11-2004 à 12:59:06    

El_gringo a écrit :

Tu pinailles. Franchement, on s'en contrefou. Une méthode aussi simple que ça, tout le monde est capable de la comprendre j'crois.  

ben justement, je la trouve particulierement imbitable par rapport à ce qu'elle fait [:itm]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed