none
séparateur decimale et vb 2010 RRS feed

  • Question

  • Bonjour à tous,

    mon problème  c'est que si le séparateur décimale est un point tout est bien et ça marche. mais si il est un virgule,alors là en entrant une valeur comme par exemple un prix ("564,34" ou bien "564.34") mon application vb . net n'accepte ni la première ni la deuxième valeur

    Aidez moi s.v.p et merci d'avance



    lundi 29 juillet 2013 08:13

Réponses

  • Le problème est que vous créez une instruction SQL vous même sous forme d'uen chaine, et dans une instruction SQL, la notation est nécessairement le point décimal (.) plutôt que la virgule. Vous risquez aussi de mauvaises surprises avec les dates (format us vs fr) et même les simples chaines (si la valeur comporte une apostrophe, la syntaxe devient incorrecte, il faudrait doubler l'apostrophe).

    Vous utilisez quelle base ? Je suggère fortement de toujours utiliser des requêtes paramétrées : http://codes-sources.commentcamarche.net/faq/709-utilisation-des-requetes-parametrees-avec-ado-net-2-0

    Dans ce cas, vous indiquez la valeur de chaque paramètre dans son format natif et elle sera transmise automatiquement vers SQL Server (ou autre) sous une forme qui ne dépendra jamais d'un réglage externe quelconque (cela fournit également une sécurité accrue contre les attaques par injection (saisie d'une donnée destinée à altérer l'instruction SQL que vous construisez pour lui faire faire autre chose que prévu))


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    mardi 30 juillet 2013 11:19
    Modérateur

Toutes les réponses

  • Bonjour,

    Le séparateur de décimal dépend de la culture utilisée. Vous pourriez récupérer la charactère actuel en fonction de la culture via le code suivant:

    dim monSeparateur = Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberDecimalSeparator

    A partir de là, vous pouvez substituer le "." ou la "," du text de votre textbox par le separateur.

    Méfiez-vous aussi si l'utilisateur peut rentrer 1.234,56 ou 1,234.56.

    (Il existe aussi NumberFormat.NumberGroupSeparator pour obtenir le séparateur de milliers)


    lundi 29 juillet 2013 08:33
  • Merci pour votre réponse mais je croie que vous m'avais pas compris.

    et bon j'ai vérifier manuellement quel séparateur utilise le système et j'ai trouver que le virgule est utiliser alors là mon application sera inutile elle n'accepte ni virgule ni point comme séparateur

    lundi 29 juillet 2013 08:44
  • Oui effectivement. Pourriez-vous préciser un plus ?

    D'où provient la valeur ? Input de l'utilisateur ou lecteur d'un fichier/DB ?

    Si c'est un input de l'utilisateur, vous pourriez créer votre propre usercontrol qui n'accepte que des chiffres si c'est le but (donc pas de virgule ou de point)

    lundi 29 juillet 2013 08:50
  • premièrement c a l'utilisateur de faire la saisie de cette valeur.

    deuxièmement je ne peux pas obliger au clients qui utilisent mon application de faire que la saisie des chiffres
    et s'il a des nbre décimale que doit-il faire et surtout mont application consiste a faire déclarer tout ses chiffres d'affaires



    • Modifié bolbolhari lundi 29 juillet 2013 09:00 fausse ecriture
    lundi 29 juillet 2013 08:55
  • Merci pour ces précisions.

    Pourquoi ne pas utiliser la méthode static Double.TryParse pour tester s'il s'agit d'un chiffre ?

    Vous pouvez aussi créer votre "numeric" textbox qui n'accepte que des chiffres, le point ou la virgule (en substituant si nécessaire). Voici un exemple de code que j'utilise pour un control WinForms mais ça peut vous inspirer pour créer le vôtre en WPF. Ici, je rends possible un chiffre négative via la propriété adéquate.

    Imports System.Windows.Forms
    Imports System.Threading
    Imports System.ComponentModel
    
    Public Class NumericTextBox
        Inherits TextBox
    
        Public Sub New()
            AllowDecimal = True
            AllowNegative = True
        End Sub
    
        <DefaultValue(True),
         Description("Indicates if the control accepts decimal number."),
         Category("Behavior")>
        Public Property AllowDecimal As Boolean
    
        <DefaultValue(True),
         Description("Indicates if the control accepts negative number."),
         Category("Behavior")>
        Public Property AllowNegative As Boolean
    
    
        Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
            MyBase.OnKeyPress(e)
    
            ' first define the decimal separator defined for the current culture
            Dim decimalSeparator = Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberDecimalSeparator
    
            ' if the press key is the group separator (for example "." for nl) it will be converted to a decimal separator (for example "," for nl)
            If e.KeyChar = Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberGroupSeparator Then
                e.KeyChar = decimalSeparator
            End If
    
            ' if the key press is "." (from the numeric keyboard for example), and the group separator is not ".", convert to ","
            If Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberGroupSeparator <> "." And e.KeyChar = "." Then
                e.KeyChar = decimalSeparator
            End If
    
            'only once a separator accepted
            If e.KeyChar = decimalSeparator Then
    
                If Not AllowDecimal Then
                    e.Handled = True
                    Return
                End If
    
                e.Handled = Me.Text.Contains(decimalSeparator)
    
                If e.Handled = True Then Return
            End If
    
            ' if negative allowed, sign only as first position
            If e.KeyChar = "-" Then
                e.Handled = Not AllowNegative Or Me.SelectionStart <> 0
                Return
            End If
    
            ' hex 8=backspace
            ' hex 127=del
            ' accept backspace (hex 8), del (hex 127), a decimalseparator or a number
            e.Handled = Not (e.KeyChar = Convert.ToChar(&H8) _
                 OrElse e.KeyChar = Convert.ToChar(&H7F) _
                 OrElse e.KeyChar = decimalSeparator _
                 OrElse Char.IsNumber(e.KeyChar))
    
        End Sub
    
    
    End Class


    • Modifié V HELLIN lundi 29 juillet 2013 09:09 correction faute d'orthographe
    lundi 29 juillet 2013 09:08
  • si le séparateur décimale est un point tout est bien et ça marche.

    mais si il est un virgule, alors là en entrant une valeur comme par exemple un prix ("564,34" ou bien "564.34") mon application vb . net n'accepte ni la première ni la deuxième valeur


    Bonjour,

    C'est pas clair ta demande !

    Tu commences par dire que si c'est un point ça marche, pour ensuite expliquer que si c'est une virgule ou un point ça ne marche pas, que faut-il comprendre ?

    Lato sensu, tu peux simplement et entre autres, prendre ton nombre en chaîne, faire une conversion de la virgule en point s'il y a lieu, puis de réaffecter ta chaîne à ta variable numérique.

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    lundi 29 juillet 2013 09:10
  • merci pour votre précision mais le probleme c que si le separateur decimale que utilise le système(panneau de configuration\région et langue)est Virlgule donc en entrant des décimaux mon application ne les acceptes pas ni avec virgule"34534,35" ni avec point "547567.353456" contrairement que si le separateur utiliser par le système(panneau de configuration\région et langue) . j'ai aucun problème
    • Modifié bolbolhari lundi 29 juillet 2013 10:04 erreur
    lundi 29 juillet 2013 09:45
  • Bonjour,

    Quel est le code utilisé pour convertir les valeurs saisies en numérique ? Normalement, le principe est que la conversion se base par défaut sur la culture en cours pour permettre la saisie avec le réglage que l'utilisateur a demandé.

    Par exemple une appli test avec une TextBox et un bouton et le code suivant mde donne bien 12 si j'entre 1,2 et que je clique sur le bouton :

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim value As Single
            If Single.TryParse(TextBox1.Text, value) Then
                MsgBox(value * 10)
            Else
                MsgBox("Saisir une valeur numérique.")
            End If
        End Sub


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 29 juillet 2013 10:53
    Modérateur
  • Bonjour,

    ça y est j'ai trouver la solution c'est qu'il faut ajouter "val" dans mon instruction par exemple

    sql = "UPDATE BCDDET SET NumAutorisation='" & frmModifierBCD.TxtAuto.Text _
            & "', NumBCD='" & frmModifierBCD.TxtNBCD.Text _
            & "', NumFacture='" & frmModifierBCD.TxtNumFact.Text _
            & "', PAHT='" & val(frmModifierBCD.TxtPAHT.Text) _
            & "', MTTVA='" & frmModifierBCD.TxtMTTVAS.Text _
            & "', Objet1= '" & frmModifierBCD.TxtObj1.Text _
            & "', objet2= '" & frmModifierBCD.TxtObj2.Text _
            & "', NomPrenom='" & frmModifierBCD.CbRS.Text _
            & "', MF1='" & frmModifierBCD.TxtMTF1.Text _
            & "', MF2='" & frmModifierBCD.TxtMTF2.Text _
            & "', MF3='" & frmModifierBCD.TxtMTF3.Text _
            & "', MF4='" & frmModifierBCD.TxtMTF4.Text _
            & "', MF5='" & frmModifierBCD.TxtMTF5.Text _
            & "', DateFacture='" & CDate(frmModifierBCD.DateFact.Text) _
            & "', DateBCD='" & CDate(frmModifierBCD.DateBCD.Text) _
            & "', Trimestre='" & x _
            & "', NumRang='" & Val(frmModifierBCD.txtOrdre.Text) _
            & "' WHERE Num =" & Val(frmAcceuil.DataGridView3.CurrentRow.Cells(18).Value)
    regarder au niveau du 4ieme ligne



    • Modifié bolbolhari mardi 30 juillet 2013 09:58 mis ajour
    mardi 30 juillet 2013 09:56
  • Suite ...

    Je ne crois pas que ce soit VAL qu'il faille utiliser, car ça ne fonctionne pas dans tous les cas, exemple :

     Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim x As Double = 0.0
        x = Val(TextBox1.Text) ' saisie = 13,3
        MsgBox(x) ' résultat = 13
        ' si saisie = a : retourne 0
      End Sub

    Donc, a priori c'est le point qui est accepté dans l'absolu, alors sans doute est-ce mieux d'utiliser la conversion en point et aussi d'utiliser la bonne conversion selon la variable (cint, cdbl)...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe mardi 30 juillet 2013 11:06 validé par erreur
    mardi 30 juillet 2013 11:04
  • Le problème est que vous créez une instruction SQL vous même sous forme d'uen chaine, et dans une instruction SQL, la notation est nécessairement le point décimal (.) plutôt que la virgule. Vous risquez aussi de mauvaises surprises avec les dates (format us vs fr) et même les simples chaines (si la valeur comporte une apostrophe, la syntaxe devient incorrecte, il faudrait doubler l'apostrophe).

    Vous utilisez quelle base ? Je suggère fortement de toujours utiliser des requêtes paramétrées : http://codes-sources.commentcamarche.net/faq/709-utilisation-des-requetes-parametrees-avec-ado-net-2-0

    Dans ce cas, vous indiquez la valeur de chaque paramètre dans son format natif et elle sera transmise automatiquement vers SQL Server (ou autre) sous une forme qui ne dépendra jamais d'un réglage externe quelconque (cela fournit également une sécurité accrue contre les attaques par injection (saisie d'une donnée destinée à altérer l'instruction SQL que vous construisez pour lui faire faire autre chose que prévu))


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    mardi 30 juillet 2013 11:19
    Modérateur
  • En VB, il y a une astuce (pas très catholique, mais... quand faut y aller, faut y aller...)

    La fonction val ne prend pas en compte le paramétrage du système.

    Le séparateur est toujours le "."


    FB

    Je n'avais pas compris le context et mon post en arrivé trop tard^^

    Je rejoins totalement Patrice

    mardi 30 juillet 2013 11:56
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    lundi 5 août 2013 08:18
  • Bonjour,

    Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ? Désormais, nous marquons les solutions proposes.

    N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte.

    Merci !

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 7 août 2013 10:45
  • Bonjour

    J'ai un peut ramer sur ce sujet aussi, ou j'ai des réponse en tous genres

    Si c'est pour écrire les données dans une DB SQL alors requêtes paramétrées ( voir Patrice )

    Pour ma part je suis passé la dessus et en plus dans le code je gère systématiquement la saisie des nombres et conversion si nécessaire avant l'écriture dans la DB

    ex: si dans un textbox le client tape: 1234,21, je remplace la virgule par le point avant envoie dans SQL

    Si par contre tu a un problème ou en sauvant un nombre du genre 123.21 dans ta DB SQL alors tu as peut être un problème de culture .

    Ou tu as peut être créé ta DB sur un serveur SQL FR puis transféré sur un SQL EN....

    Poste peut être le bout de ton code qui te pose problème


    La Connaissance est comme la joie elle s'accroît en la partageant!

    mardi 20 août 2013 17:17