lelouch_vi 2 Ответов: 2

Как добавить запятые после 3-х цифр в VB.NET-что?


Привет,

У меня возникла проблема с отображением запятых после каждых 3 цифр в моем текстовом поле. Я не набираю значение в текстовом поле, я использую кнопку для вставки чисел. Честно говоря, я читал документы и искал в интернете, как это сделать правильно, но на самом деле я этого не понимаю.

Я уже читал это
https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings[^]

Строки.Метод Format(Object, String) (Microsoft.VisualBasic) | Microsoft Docs[^]


Но я не могу заставить его работать
Вот код, который я использую для вставки чисел в текстовое поле:

Private Sub btnNumbers(sender As Object, e As EventArgs) Handles btn0.Click, btn1.Click, btn2.Click, btn3.Click, btn4.Click, btn5.Click, btn6.Click, btn7.Click, btn8.Click, btn9.Click, btnDecimal.Click

Dim btnB As Guna.UI.WinForms.GunaButton = DirectCast(sender,Guna.UI.WinForms.GunaButton)


        If txtInput.Text.Length >= txtInput.MaxLength Then


            Exit Sub

        Else

            If txtInput.Text = "0" Or expression Then

                txtInput.Text = ""
                txtInput.Text = btnB.Text
                expression = False

            ElseIf btnB.Text = "." Then

                If Not txtInput.Text.Contains(".") Then

                    txtInput.Text = txtInput.Text + btnB.Text

                End If

            Else
              
                txtInput.Text = txtInput.Text + btnB.Text

            End If


        End If


    End Sub


Что я уже пробовал:

А вот код, который я пытаюсь использовать, чтобы добавить запятые после 3 цифр, но я не могу заставить его работать:

txtInput.Text = txtInput.Text + btnB.Text
Dim value As Integer = Convert.ToInt32(txtInput.Text)
txtInput.Text = value.ToString("N0")


После вставки 4 цифр например 1000 он выдает исключение: Система.FormatException: 'входная строка была не в правильном формате Исключение составляет указание на строку, которая выделена жирным шрифтом и имеет подчеркивание.

Я действительно заблудился. Я пытался разобраться в документах но ничего не понял

2 Ответов

Рейтинг:
0

Richard Deeming

Convert.ToInt32 не будет работать, если входная строка содержит разделитель тысяч.

Попробуй:

Dim value As Ineger = Integer.Parse(txtInput.Text, System.Globalization.NumberStyles.Integer Or System.Globalization.NumberStyles.AllowThousands)
txtInput.Text = value.ToString("N0")
Int32.Метод Синтаксического Анализа (System) | Microsoft Docs[^]
Перечисления NumberStyles (Системы.Глобализация) | Microsoft Docs[^]


Maciej Los

5ed!

lelouch_vi 2

Привет Ричард Диминг,

Спасибо за решение, я действительно поражен этим перечислением numberstyle. Теперь моя проблема заключается в том, что текстовое поле не принимает десятичное значение, оно принимает только целые числа.

lelouch_vi 2

Вот мой код сейчас

 Dim value As Decimal



        If txtInput.Text.Length >= txtInput.MaxLength Then


            Exit Sub

        Else

            If txtInput.Text = "0" Or expression Then

                txtInput.Text = ""
                txtInput.Text = btnB.Text
                expression = False

            ElseIf btnB.Text = "." Then

                If Not txtInput.Text.Contains(".") Then

                    txtInput.Text = txtInput.Text + btnB.Text

                End If

            Else

                txtInput.Text = txtInput.Text + btnB.Text
                value = Decimal.Parse(txtInput.Text, 
                        System.Globalization.NumberStyles.Number Or 
                        System.Globalization.NumberStyles.AllowThousands)
                txtInput.Text = value.ToString("N0")


            End If


        End If

phil.o

NumberStyles.Number уже содержать NumberStyles.AllowThousands- Тогда нет необходимости уточнять последнее.

value = Decimal.Parse(txtInput.Text, System.Globalization.NumberStyles.Number)

Richard Deeming

👍 Хороший улов.

Рейтинг:
0

phil.o

Это делается для преобразования целого числа в его строковое представление с использованием запятой в качестве разделителя тысяч:

int value = 1000;
string representation = value.ToString("#,0"); // representation == "1,000"

А это значит получить целочисленное значение из строки используя запятую в качестве разделителя тысяч:
string representation = "1,000";

// Non-checking version
// Will throw an exception if representation is not a valid integer representation
int value = int.Parse(representation, NumberStyles.AllowThousands);

// Checking version
// Let you handle the case where representation is not a valid integer representation
int value;
if (int.TryParse(representation, NumberStyles.AllowThousands, CultureInfo.InvariantCulture /* or CultureInfo.CurrentCulture */, out value)
{
   // representation is valid
}
else
{
   // representation is invalid
}


Maciej Los

5ed!

lelouch_vi 2

Привет, Фил.,

Теперь я получил свой код, используя ответ, предоставленный Ричардом Димингом.
пожалуйста, взгляните на мой код. Я не понимаю, почему он перестает принимать десятичное значение. Теперь он принимает только целые числа.

 Dim value As Decimal



        If txtInput.Text.Length >= txtInput.MaxLength Then


            Exit Sub

        Else

            If txtInput.Text = "0" Or expression Then

                txtInput.Text = ""
                txtInput.Text = btnB.Text
                expression = False

            ElseIf btnB.Text = "." Then

                If Not txtInput.Text.Contains(".") Then

                    txtInput.Text = txtInput.Text + btnB.Text

                End If

            Else

                txtInput.Text = txtInput.Text + btnB.Text
                value = Decimal.Parse(txtInput.Text, 
                        System.Globalization.NumberStyles.Number Or 
                        System.Globalization.NumberStyles.AllowThousands)
                txtInput.Text = value.ToString("N0")


            End If


        End If

phil.o

Потому что вы используете N0 как спецификатор формата, который приводит к десятичному числу с 0 десятичными цифрами. Попробуйте заменить N0 с N, например.

lelouch_vi 2

привет, Фил.,

После игры с N спецификатор я думаю N0 самый лучший. Я старался использовать только N и моя программа принимает только одно целое число, а затем всякий раз, когда я нажимаю другую кнопку со значением от 1 до 9, она просто добавляет 1 к правильному индексу, он станет таким же, как этот 1.01... продолжая нажимать кнопку, он просто добавит 0,01 в текстовое поле. Вы должны нажать сто раз, чтобы сделать это 2.00.

Добавление запятых после каждых 3 цифр теперь работает нормально, но вставка десятичной дроби теперь является проблемой.