Supprimer les espaces dans un String

Résolu/Fermé
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 - Modifié par pijaku le 28/03/2014 à 16:38
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 - 31 mars 2014 à 22:36
Bonjour,

j'ai créé la méthode suivante :

public static long StoL(String s){
  if(s.equals("")) return 0;
  long l;
  String nb = s.replace(" ", "");
  System.out.println(nb);
  l = Long.valueOf(nb);
  
  return l;
 }

qui a pour but de transformer une chaîne de caractères qui contient que des chiffres et des espaces (par ex: "12 321") en un long
du coup afin de pouvoir utiliser la méthode Long.valueOf je dois supprimer les espaces pour qu'il me reste que des chiffres.
mais ça bug, et je ne sais pas pourquoi !

Merci pour vos réponses :)

9 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 28/03/2014 à 18:55
Bonjour,

Pour déboguer peux tu nous dire ce que donne ce code :

public static long StoL(String str)
{
    if (str.isEmpty())
        return 0;
    
    String space = " ";
    String nb = str.replace(space, "");
    
    System.out.println(java.util.Arrays.toString(space.getBytes()));
    System.out.println(java.util.Arrays.toString(str.getBytes()));
    System.out.println(java.util.Arrays.toString(nb.getBytes()));
    
    return Long.valueOf(nb);
}

La confiance n'exclut pas le contrôle
1
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 1
29 mars 2014 à 11:43
Bonjour,

walidovich_85 :

Oui j'avoue que ça n'a aucun sens voici le début de la fonction

class monaction implements ActionListener {

public void actionPerformed(ActionEvent arg0) {
Point E[];
Point P = new Point(0, 0);
Point Q = new Point(0, 0);
Point R = new Point(0, 0);
int i, j;
String s;
long n = 0, q = 0, a = 0, b = 0;
a = Point.StoL(Tex[0].getText());
b = Point.StoL(Tex[1].getText());
q = Point.StoL(Tex[2].getText());

le reste si des calculs

KX :

voila le résultat affiché : j'ai mis comme entrée "1 234"
[32]
[49, -96, 50, 51, 52]
[49, -96, 50, 51, 52]


Merci beaucoup :)
1
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 1
29 mars 2014 à 11:51
Mon Tex[0] je l'ai créé comme ça :

Tex[i] = new JFormattedTextField(NumberFormat.getNumberInstance());

pour stoker que les nombre dans mon champ d'écriture, et du coups ça ajoute des espaces automatiquement entre chaque groupe de 3 chiffres "1 424 128"
mais apparemment ce sont pas des espaces ordinaires, je ne sais pas comment les supprimer afin de transformer ce String en long.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 29/03/2014 à 12:52
Tu as un problème d'encodage. Les espaces que tu as dans ton code sont "normaux" (byte=32), mais ceux que tu tapes dans ton interface graphique sont différents (byte=-96)
Java essaye de supprimer tous les byte 32 mais il n'y en a pas car tu n'as que des byte -96

Après quelques recherches, le byte -96 correspond au "non-breaking space" (  en html) qui est différent de l'espace.

Voici une manière de modifier ton code, en ne supprimant pas uniquement les espaces, mais tout ce qui n'est pas des chiffres (ou les signes + et -)

String nb = s.replaceAll("[^\\d-\\+]", "");
0
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 1
29 mars 2014 à 16:28
Merci beaucoup KX pour votre aide, ça marche parfaitement :)
j'ai bien aimé votre astuce
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
31 mars 2014 à 22:36
Le roi KX.
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
28 mars 2014 à 11:20
Bonjour,

« ça bug », ça n'est pas très clair !
Un message d'erreur ? À la compilation ? À l'exécution ? Un comportement non souhaité ? Un résultat différent de celui attendu ?

Xavier
0
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 1
28 mars 2014 à 11:22
voila le message d'erreur
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "2 132"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Long.parseLong(Unknown Source)
at java.lang.Long.valueOf(Unknown Source)
at Point.StoL(Point.java:158)
at Fenetre$monaction.actionPerformed(Fenetre.java:145)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
28 mars 2014 à 16:35
Bonsoir,

Ta fonction marche très bien. et l'erreur ne peut pas venir de la fonction StoL directement.

Mais c clair que cette fonction fait partie d'un code plus large qui contient des boutons et des entrées sorties.

Si vous pouvez le partager, ça serait plus facile pour vous aider.

Bonne chance
0
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 1
28 mars 2014 à 16:57
La fonction est utilisé dans cette ligne :

long a = Point.StoL(Tex[0].getText());

avec Tex est un tableau de JLabel

j'ai essayé ma fonction StoL séparément dans le main avec un exemple est ça marche marfaitement, mais quand j'essaie de l'utiliser avec ma fenêtre avec java swing ça m'affiche cette erreur.
j'ai mis un affichage de nb dans ma fonction StoL pour voir est ce que les espaces ont été bien supprimé, mais apparament il supprime pas les espaces, du coup ValueOf bug avec des espaces entre les chiffres
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 28/03/2014 à 17:32
Puisque la fonction marche parfaitement séparée, alors l'erreur ne peut venir que de l'entrée T[0].getText();

Pouvez vous l'afficher avant de la passer vers la fonction SotL?

Being normal is boring... being geek is interesting
0
talbsbast Messages postés 54 Date d'inscription mardi 21 juin 2011 Statut Membre Dernière intervention 3 février 2023 1
28 mars 2014 à 18:06
Pour une entrée par exemple dans T[0].getText() je mis "12 345"
j'ai fait un affichage de T[0].getText(); il l'affiche bien "12 345"
le problème quand j'affiche nb :
String nb = s.replace(" ", "");
System.out.println(nb);
il m'affiche nb = "12 345" !!!!!! il ne supprime pas les espaces !!!
je ne comprend rien !
toute à l'heur je me suis trompé en vous disant que T[0] est un JLabel en fait c'est un JFormattedTextField, mais ça ne change rien au problème j'imagine.

Merci pour votre aide si vous avez des idées :)
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 28/03/2014 à 18:25
J'ai testé ça:

public static void main(String args[]) throws Exception
    {
 String s = new String("129 98  287");
 System.out.println("La chaine s :\t\t" + s);
 JFormattedTextField jt = new JFormattedTextField(s);
 Long l = StoL(jt.getText());
 System.out.println("l'entier Long: \t\t" + l);
    }


résultat parfait:

La chaine s :            129 98  287
nb dans la fonction:     12998287
l'entier Long:           12998287


ça n'a aucun sens qu ça fonctionne pas chez vous.
Si non, pouvez vous encore partager la partie du code qui implique le JFormattedTextField?

Being normal is boring... being geek is interesting
0