none
Format de nombre "0,00" dans un TextBox RRS feed

  • Question

  • Bonjour dans un TextBox, l'utilisateur est invité à entrer un nombre entier ou à virgule à l'aide du pavé numérique du clavier.

    Il s'affiche comme ceci : 182.32

    Je souhaiterais qu'il s'affiche : 182,32

    Je pense qu'il faut utiliser "CultureInfo.CreateSpecificCulture("en-GB") mais je ne vois pas trop comment faire


    JF Collombet ® CreateSpecificCulture

    jeudi 14 juillet 2016 04:18

Réponses

  • Pour WPF c'est un peu différent:

     Private LastValue As String = ""
    
    
        Private Sub textBox_PreviewKeyDown(sender As Object, e As KeyEventArgs) Handles textBox.PreviewKeyDown
            Dim currenttextbox As TextBox = TryCast(sender, TextBox)
    
    
            'Seuls les numérics et virgule ou point sont admis
            If Not e.Key = Key.LeftCtrl AndAlso Not e.Key = Key.RightCtrl AndAlso Not (Key.V = e.Key And Keyboard.Modifiers = ModifierKeys.Control) AndAlso Not e.Key = Key.Delete AndAlso Not e.Key = Key.Return AndAlso Not e.Key = Key.Back AndAlso Not (e.Key >= Key.D0 And e.Key <= Key.D9) AndAlso Not (e.Key >= Key.NumPad0 And e.Key <= Key.NumPad9) AndAlso e.Key <> Key.OemComma AndAlso e.Key <> e.Key.OemPeriod AndAlso e.Key <> e.Key.Decimal Then
                e.Handled = True
                Return
            End If
    
    
            'Pour prevenir que la chaine ne commance pas par un point ou une virgule et qu'il n'y ait pas plusieurs point ou virguke
            If (e.Key = e.Key.OemComma OrElse e.Key = e.Key.OemPeriod OrElse e.Key = e.Key.Decimal) AndAlso (currenttextbox.Text.IndexOf(",") > -1 OrElse currenttextbox.Text.Length = 0) Then
                e.Handled = True
                Return
            End If
    
    
            ' On remplace le . par la virguke
            If e.Key = e.Key.Decimal Then
    
                e.Handled = True
                Dim lastLocation As Int32 = currenttextbox.SelectionStart
                currenttextbox.Text = currenttextbox.Text.Insert(lastLocation, ",")
                currenttextbox.SelectionStart = lastLocation + 1
    
    
            End If
        End Sub
    
    
    
        Private Sub textBox_TextChanged(sender As Object, e As TextChangedEventArgs) Handles textBox.TextChanged
            Dim currenttextbox As TextBox = TryCast(sender, TextBox)
            If String.IsNullOrEmpty(currenttextbox.Text) Then
                Return
            End If
    
    
            Dim val As Decimal
            If Not [Decimal].TryParse(currenttextbox.Text.Replace(".", ","), val) Then
                currenttextbox.Text = LastValue
                Return
            End If
    
    
            If currenttextbox.Text.Contains(".") Then
                currenttextbox.Text = currenttextbox.Text.Replace(".", ",")
            End If
    
    
            LastValue = currenttextbox.Text
        End Sub
    
        Private Sub textBox_GotFocus(sender As Object, e As RoutedEventArgs) Handles textBox.GotFocus
            LastValue = textBox.Text
        End Sub
    


    samedi 16 juillet 2016 10:46

Toutes les réponses

  • Bonjour,

    Il faut affecter la Culture et la UICulture du thread principala au lancement de votre appli (dans la procédure Main).

    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR")
    
    https://msdn.microsoft.com/fr-fr/library/b28bx3bh(VS.80).aspx


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone


    jeudi 14 juillet 2016 08:27
  • Bonjour,

    Essaie ça ;)

           private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                TextBox currenttextbox = sender as TextBox;
                //Seuls les numérics et virgule ou point sont admis
                if (!char.IsControl(e.KeyChar)
                    && !char.IsDigit(e.KeyChar) && e.KeyChar != ',' && e.KeyChar != '.'
                   )
                {
                    e.Handled = true;
                    return;
                }
                //Pour prevenir que la chaine ne commance pas par un point ou une virgule et qu'il n'y ait pas plusieurs point ou virguke
                if ((e.KeyChar == ',' || e.KeyChar == '.')
                    && (currenttextbox.Text.IndexOf(',') > -1 || currenttextbox.Text.Length==0))
                {
                    e.Handled = true;
                    return;
                }

                // On remplace le . par la virguke
                if (e.KeyChar == '.')
                {
                    e.KeyChar = ',';
                }
            }
          
            #region Pour prévenir des copier collé malencontreux
            string LastValue = "";
            private void textBox1_Enter(object sender, EventArgs e)
            {
                LastValue = textBox1.Text;
            }
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                if (string.IsNullOrEmpty(textBox1.Text)) return;
                decimal val;
                if (!Decimal.TryParse(textBox1.Text.Replace(".", ","), out val))
                {
                    textBox1.Text = LastValue;
                    return;
                }
                if (textBox1.Text.Contains("."))
                {
                    textBox1.Text = textBox1.Text.Replace(".", ",");
                }
                LastValue = textBox1.Text;
            }
            #endregion


    • Modifié Johnny Grun jeudi 14 juillet 2016 09:02
    • Proposé comme réponse Johnny Grun jeudi 14 juillet 2016 10:05
    jeudi 14 juillet 2016 09:01
  • Bonjour,

    Il faut affecter la Culture et la UICulture du thread principala au lancement de votre appli (dans la procédure Main).

    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR")
    https://msdn.microsoft.com/fr-fr/library/b28bx3bh(VS.80).aspx


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone


    Bonjour,

    Désolé Richard Clark mais votre solution n'empêche pas de saisir un point avec le pavé numérique, comme demandé dans l'énoncé ;)

    Cordialement


    jeudi 14 juillet 2016 11:53
  • Cette solution, c'est du bidouillage.

    Un nombre, suivant sa culture, a un format bien défini. La preuve étant le code pour parser un string en decimal ou double ou autre n'est vraiment pas trivial.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    jeudi 14 juillet 2016 13:01
  • Appelez ça comme vous voulez mais ma réponse répond à la question, à savoir "à l'aide du pavé numérique du clavier".... "Je souhaiterais qu'il s'affiche : 182,32", ce qui n'est pas votre cas, j'ai testé votre code. Il y a une différence entre définir le format numérique au sein de l'application et avoir un control qui fait ce que tu lui demandes. Perso en général je code pas comme ça, je laisse saisir et je contrôle avec un errorprovider, mais c'est ce que la personne demandait.




    jeudi 14 juillet 2016 13:26
  • Bonjour,

    J’ai moi-même été confronté à ce problème. Et de plus, il faut également vérifier que l’utilisateur ne rentre que des chiffres (et pas des lettres ou autres caractères).

    Principe :

    Avec l’événement KeyPress, si l’utilisateur tape un point, on le remplace par une virgule.

    Puis quand il quitte la textBox, on vérifie qu’il a bien entré un nombre avec l’événement Validating.

    Voici donc ma proposition, qui suppose que dans ta Form, tu aies placé :

    1 textBox (textBox2)

    1 errorProvider (errorProvider1)

    Que tu aies défini les événements :

    KeyPress

    Validated

    Validating

     

    private void textBox2_Validating(object sender, CancelEventArgs e)

            {

                string errorMsg;

                if (!ValidTBox2(textBox2.Text, out errorMsg))

                {

                    // Cancel the event and select the text to be corrected by the user.

                    e.Cancel = true;

                    textBox2.Select(0, textBox1.Text.Length);

     

                    // Set the ErrorProvider error with the text to display.

                    this.errorProvider1.SetError(textBox2, errorMsg);

                }

            }

     

            private void textBox2_Validated(object sender, EventArgs e)

            {

                // If all conditions have been met, clear the ErrorProvider of errors.

                errorProvider1.SetError(textBox2, "");

            }

     

     

            private void textBox2_KeyPress(object sender, KeyPressEventArgs e)

            {

                if (e.KeyChar == '.')

                {

                    e.KeyChar = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];

                }

            }

     

            public bool ValidTBox2(string pAchat, out string errorMessage)

            {

                try

                {

                    Decimal.Parse(pAchat);

                    errorMessage = "";

                    return true;

     

                }

                catch (FormatException)

                {

                    errorMessage = "le format de nombre n'est pas correct";

                    return false;

                }

     

               

            }

    En espérant que cet exemple est clair et qu’il pourra t’aider.

    vendredi 15 juillet 2016 13:05
  • Merci pour ce code mais je travaille en VB dans un projet WPF et j'obtient des erreurs de code :

    e.KeyChar ne sont pas reconnus


    JF Collombet ® CreateSpecificCulture

    samedi 16 juillet 2016 04:47
  • Pour WPF c'est un peu différent:

     Private LastValue As String = ""
    
    
        Private Sub textBox_PreviewKeyDown(sender As Object, e As KeyEventArgs) Handles textBox.PreviewKeyDown
            Dim currenttextbox As TextBox = TryCast(sender, TextBox)
    
    
            'Seuls les numérics et virgule ou point sont admis
            If Not e.Key = Key.LeftCtrl AndAlso Not e.Key = Key.RightCtrl AndAlso Not (Key.V = e.Key And Keyboard.Modifiers = ModifierKeys.Control) AndAlso Not e.Key = Key.Delete AndAlso Not e.Key = Key.Return AndAlso Not e.Key = Key.Back AndAlso Not (e.Key >= Key.D0 And e.Key <= Key.D9) AndAlso Not (e.Key >= Key.NumPad0 And e.Key <= Key.NumPad9) AndAlso e.Key <> Key.OemComma AndAlso e.Key <> e.Key.OemPeriod AndAlso e.Key <> e.Key.Decimal Then
                e.Handled = True
                Return
            End If
    
    
            'Pour prevenir que la chaine ne commance pas par un point ou une virgule et qu'il n'y ait pas plusieurs point ou virguke
            If (e.Key = e.Key.OemComma OrElse e.Key = e.Key.OemPeriod OrElse e.Key = e.Key.Decimal) AndAlso (currenttextbox.Text.IndexOf(",") > -1 OrElse currenttextbox.Text.Length = 0) Then
                e.Handled = True
                Return
            End If
    
    
            ' On remplace le . par la virguke
            If e.Key = e.Key.Decimal Then
    
                e.Handled = True
                Dim lastLocation As Int32 = currenttextbox.SelectionStart
                currenttextbox.Text = currenttextbox.Text.Insert(lastLocation, ",")
                currenttextbox.SelectionStart = lastLocation + 1
    
    
            End If
        End Sub
    
    
    
        Private Sub textBox_TextChanged(sender As Object, e As TextChangedEventArgs) Handles textBox.TextChanged
            Dim currenttextbox As TextBox = TryCast(sender, TextBox)
            If String.IsNullOrEmpty(currenttextbox.Text) Then
                Return
            End If
    
    
            Dim val As Decimal
            If Not [Decimal].TryParse(currenttextbox.Text.Replace(".", ","), val) Then
                currenttextbox.Text = LastValue
                Return
            End If
    
    
            If currenttextbox.Text.Contains(".") Then
                currenttextbox.Text = currenttextbox.Text.Replace(".", ",")
            End If
    
    
            LastValue = currenttextbox.Text
        End Sub
    
        Private Sub textBox_GotFocus(sender As Object, e As RoutedEventArgs) Handles textBox.GotFocus
            LastValue = textBox.Text
        End Sub
    


    samedi 16 juillet 2016 10:46