IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

fonction Replace() qui ne fonctionne pas pour changer un espace en rien


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut fonction Replace() qui ne fonctionne pas pour changer un espace en rien
    Bonjour à tous,

    J'ai une chaîne qui comporte un espace que je dois supprimer avant de l'envoyer sur la BDD.
    Problème : la requête SQL est en erreur ==>

    ERROR [22P02] ERROR: invalid input syntax for type numeric: "3�260.00";
    Error while executing the query
    Ma chaîne est "3 260.00", j'utilise donc la fonction Replace(, " ","") pour supprimer l'espace en question.

    Comme on peut voir dans le message d'erreur, il y a un caractère "�" qui n'est pas reconnu par PostGreSQL.
    D'où peut-il bien venir sachant que c'est un espace transformé en "rien" ?

    Merci à tous.


    EDIT : le bloc de code ne connaît pas "�"

  2. #2
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Avant d'effectuer ta requête, tu pourrais convertir ta chaîne en un Float.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  3. #3
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut
    C'est exactement ce que je viens de faire et ça me renvoi :

    Conversion from string "3�399.98" to type 'Double' is not valid.

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Mais tu le fais dans ton code? du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim MonPrix as string = "3 254,45"
    Dim MonPrixFloat as Float = MaFonction(MonPrix)
     
    Execute_ma_requete ("Insert into matable (monprix) values (" & MonPrixFloat & ")")
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #5
    Membre habitué Avatar de sihammaster
    Webmaster
    Inscrit en
    Mai 2009
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Webmaster
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 256
    Points : 183
    Points
    183
    Par défaut
    Bonjour,
    Essayer cet exemple ca marche chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim MonPrix As String = "3 254,45"
            MonPrix = MonPrix.Replace(" ", "")
            MessageBox.Show(MonPrix.Trim)
    Bonne Continuation.

  6. #6
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut
    Oui effectivement, je le fais dans le code, au moment de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO matable (champ) VALUES " & CType(monprix,Double)

  7. #7
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par sihammaster Voir le message
    Bonjour,
    Essayer cet exemple ca marche chez moi:
    Dim MonPrix As String = "3 254,45"
    MonPrix = MonPrix.Replace(" ", "")
    MessageBox.Show(MonPrix.Trim)
    Bonne Continuation.
    Oui effectivement j'avais essayé, quand je l'affiche comme ça, cela fonctionne. Mais PostGreSQL n'a pas l'air de le voir de cette façon. Au lien de mettre "", il faut croire qu'il y a "rien". Vous me suivez ?

  8. #8
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Transformer un Double en String, ça sent la tâche pour la surcharge de Double.ToString(format, provider) ça

    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    'Déclaration d'un Double
    Dim doubleValue As Double = 3260.0
     
    'Conversion du Double en String selon le format ; partie entière et décimale,
    'séparateur de milliers, séparateur décimal et signe négatif optionnel définis
    'selon la culture en cours sur le système - français normalement -
    Dim stringValue As String = doubleValue.ToString("N2", Globalization.NumberFormatInfo.CurrentInfo)
     
    'Affichage de la valeur (résultat obtenu: 3 620,00)
    Console.WriteLine(stringValue)
     
    'Conversion du Double en String selon le format ; partie entière et décimale,
    'séparateur décimal et signe négatif optionnel définis
    'selon la culture dite invariante/neutre
    stringValue = doubleValue.ToString("F2", Globalization.NumberFormatInfo.InvariantInfo)
     
    'Affichage de la valeur (résultat obtenu: 3620.00)
    Console.WriteLine(stringValue)

    Voilà en espérant avoir aidé un peu, plus d'infos sur les formats numériques disponible sur msdn
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  9. #9
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut
    En fait on cherche plutôt à transformer un string en double.
    Bref, en fait pour mieux expliquer le contexte, j'ai un prog qui va lire un fichier text, puis qui split les lignes pour extraire chaque donnée que je vais ensuite envoyer dans la BDD.
    Voilà pourquoi mes chiffres sont en string.

  10. #10
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut
    OK je viens de faire machine arrière.

    Il s'avère que le problème ne vient pas de Replace(), ce qui me rassure vu le caractère impossible de la chose.

    En fait quand le programme split la ligne du fichier text, les données ont déja ce caractère. Lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(inputs(1).ToString)
    ça me retourne "3�260.00"

    Autant vous dire que c'est bien "3 260.00" qui s'affiche dans le fichier txt (et ce n'est pas une tabulation).

    Du coup je m'enfonce, any idea ?

  11. #11
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Tu pourrais faire ça pour essayer de savoir qui est ce caractère mystère ?

    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MessageBox.Show(AscW(inputs(1).ToString()(1))
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  12. #12
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut
    Super je ne connaissais pas la fonction AscW().

    Ca me retourne 65533 !

  13. #13
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Bon voilà j'ai cherché un peu et je me retrouve avec ça qui fonctionne il y a peut être mieux, mais bon

    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim stringValue As String = "3�260.00"
    Dim doubleValue As Double
     
    Dim nfi As New Globalization.NumberFormatInfo() With {.NumberDecimalDigits = 2, .NumberDecimalSeparator = ".", .NumberGroupSeparator = ChrW(65533)}
     
    If Double.TryParse(stringValue, Globalization.NumberStyles.Number, nfi, doubleValue) Then
        Console.WriteLine("Réussite de la conversion")
    Else
        Console.WriteLine("Echec de la conversion")
    End If
     
    Console.WriteLine("Avant : {0} ; Après : {1}", stringValue, doubleValue)

    Edit: le machin bizarre dans mon nombre en fait c'est que dans la balise CODE "3�260.00" apparait comme ça (ce qui aurait permis de savoir que c'était le 65533 beaucoup plus vite on en apprend tous les jours)
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  14. #14
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut
    Arf, le problème c'est que dans mon exemple j'utilisais 3 260 mais en réalité j'ai des milliers de donneés à gérer. Je n'ai donc aucune idée du format que chaque chiffre peut avoir et je n'ose pas imaginer le traitement nécessaire pour faire un code assez générique pour ne pas avoir de problème.

    Ceci dit je me demandais si on ne peut pas appeller un "code caractère" dans la fonction Replace().
    Du genre : Replace(inputs(1).ToString,65533, "")
    ça me semble beaucoup plus simple !

  15. #15
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Tu vas faire ça (peut etre en changeant le nom du fichier s'il existe déjà chez toi) ça te permettra de récupérer un fichier contenant les différentes valeurs de ce caractère

    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Dim index As Integer
    Dim list As New List(Of Integer)()
     
    For i As Integer = 0 To nbInputs
        index = inputs(i).ToString().IndexOf(".") - 4
        If index < 1 Then Continue For
        If Not list.Contains(AscW(inputs(i).ToString()(index))) Then list.Add((AscW(inputs(i).ToString()(index)))
    Next
     
    Dim sb As New System.Text.StringBuilder()
     
    For Each item As Integer In list
        sb.AppendLine(item)
    Next
            My.Computer.FileSystem.WriteAllText(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\tmp.txt", sb.ToString(), False)
     
    MessageBox.Show("Nombre de valeurs différentes : " & list.Count)
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  16. #16
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Salut,

    essaie avec une requête paramétrée, le moteur se chargera de convertir au bon format.

  17. #17
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par MetalGeek Voir le message
    Salut,

    essaie avec une requête paramétrée, le moteur se chargera de convertir au bon format.
    Désolé mais je ne vois pas le rapport ?


    @Sehnsucht : j'essaye d'implanter, on va bien voir ce que ça donne.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Le fait d'être sous postgres devrait vous faire penser à l'encodage des caractères. Le "&#" aussi.
    Je n'ai pas la réponse mais à coup sur ça vient de là votre BD elle est définie avec quel encodage ?

    A+

  19. #19
    Membre habitué Avatar de M.Max
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par Geo2A Voir le message
    Bonjour,

    Le fait d'être sous postgres devrait vous faire penser à l'encodage des caractères. Le "&#" aussi.
    Je n'ai pas la réponse mais à coup sur ça vient de là votre BD elle est définie avec quel encodage ?

    A+
    Le problème est en amont de la BDD. Comment postgres pourrait comprendre un amoncellement de caractère et en définir une variables numerique ?

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    J'avais mal lu (j'avais cru que les données provenaient de la BD) :
    En fait quand le programme split la ligne du fichier text, les données ont déja ce caractère.
    C'est donc le fichier texte qui est encodé de façon particulière. Et le problème se situe à la lecture du fichier texte.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Fonction .replace qui ne fonctionne pas.
    Par Rominou777 dans le forum Débuter avec Java
    Réponses: 19
    Dernier message: 09/02/2012, 19h22
  2. Update et replace qui ne fonctionnent pas
    Par maysa dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/02/2008, 13h47
  3. Fonction mysql qui ne fonctionne pas pour un ancien postgreIste
    Par floreasy dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/01/2008, 18h49
  4. [SQL] Fonction SUM qui ne fonctionne pas !
    Par nigg4z dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 11/10/2007, 16h20
  5. Fonction While {} qui ne fonctionne pas
    Par zoom61 dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2006, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo