Meilleur auteur de réponses
séparateur decimale et vb 2010

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
- Modifié bolbolhari lundi 29 juillet 2013 08:14
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".
- Modifié Patrice ScribeMVP, Moderator mardi 30 juillet 2013 11:21 (ou autre base)
- Proposé comme réponse V HELLIN mardi 30 juillet 2013 11:35
- Marqué comme réponse Aurel Bera mercredi 7 août 2013 10:45
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)
-
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
-
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)
-
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
-
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
-
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 -
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
-
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".
-
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
-
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
-
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".
- Modifié Patrice ScribeMVP, Moderator mardi 30 juillet 2013 11:21 (ou autre base)
- Proposé comme réponse V HELLIN mardi 30 juillet 2013 11:35
- Marqué comme réponse Aurel Bera mercredi 7 août 2013 10:45
-
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
- Modifié FrançoisBOSSANT mardi 30 juillet 2013 12:19 correction
-
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,
-
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,
-
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!