Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 15.03.2018
Сообщений: 11

Как сделать TryParse данных в валюту?

15.03.2018, 17:34. Показов 2080. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. В общем нужно, чтобы текстбокс, куда пользователь вводит данные, допускал (но не требовал) ввод знака валюты, разделители тысяч (запятая в американском стандарте) и знак дроби (точка).

Вот мой код:

C#
1
2
3
4
5
6
      private void button1_Click(object sender, EventArgs e)
        {
            decimal x = 0m;
 
            Decimal.TryParse(textBox1.Text, System.Globalization.NumberStyles.AllowCurrencySymbol | System.Globalization.NumberStyles.AllowThousands | System.Globalization.NumberStyles.AllowDecimalPoint out x);
        }

В моем учебнике (Murach's c# 2015) прямо указывают пример такого кода. В учебнике он выглядит так: "Decimal.TryParse(txtBox.Text, NumberStyles.AllowCurrencySymbol, CultureInfo.CurrentCulture, out invoiceTotal);". Однако по какой-то неведомой причине я так написать не могу.

Собственно мои проблемы:

1) У меня в Microsoft Visual Studio 2017 такой вещи как NumberStyles нет вообще. Вместо этого редактор подставляет мне какую-то System.Globalization.NumberStyles. Вопрос - почему так?

2) У меня также нет ничего связанного с CultureInfo.CurrentCulture. Поэтому непонятно, в формате какой культуры парсить данные ?

3) Ладно, кое-как забил я этот парсинг, стараясь максимально соответствовать указанному в учебнике синтаксису. Однако, Visual Studio ругается на TryParse и говорит, что "There is no argument given that corresponds to the required formal parameter 'result' of decimal.TryParse(string, NumberStyles, IFormatProvider, out decimal)". Я также пробовал заменить TryParse на Parse, причем на этот раз ошибка другого рода - "Argument 3 may not be passed with the 'out' keyword".

Объясните пожалуйста, что именно я делаю не так, и почему код, указанный в учебнике, я не могу реализовать на практике?

Спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.03.2018, 17:34
Ответы с готовыми решениями:

Как сделать TryParse на Java
Приветствую. Есть такой код. static int Input() { int temp; while (!in.hasNextInt()) { ...

Проверка вводимых данных с DateTime.TryParse
Ребят, помогите пж. Не могу ни как понять как сделать проверку вводимых данных с помощью TryParse. Дело в том, что при добавлении данных в...

Как поменять валюту?
<form> <p>Стоимость:<input name='dol' type='text' size='10'></p> <p><div id='price'> Здесь цена в рублях </div></p> ...

7
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.03.2018, 17:38
Цитата Сообщение от antonvix Посмотреть сообщение
1) У меня в Microsoft Visual Studio 2017 такой вещи как NumberStyles нет вообще. Вместо этого редактор подставляет мне какую-то System.Globalization.NumberStyles. Вопрос - почему так?
В шапке файла не прописан using пространства System.Globalization.
Если прописать, то будет как в книге.

Цитата Сообщение от antonvix Посмотреть сообщение
2) У меня также нет ничего связанного с CultureInfo.CurrentCulture. Поэтому непонятно, в формате какой культуры парсить данные ?
То же самое.
В какой культуре парсить — зависит от того, в какой культуре ожидается ввод.

Цитата Сообщение от antonvix Посмотреть сообщение
There is no argument given that corresponds to the required formal parameter 'result' of decimal.TryParse(string, NumberStyles, IFormatProvider, out decimal)
В вызове метода у вас не хватает запятой перед out.
0
0 / 0 / 0
Регистрация: 15.03.2018
Сообщений: 11
15.03.2018, 17:50  [ТС]


Как видите, запятая стоит, а все равно ругается на TryParse. Что на этот раз не так?
0
0 / 0 / 0
Регистрация: 15.03.2018
Сообщений: 11
15.03.2018, 18:06  [ТС]
В общем, погуглив, решил сделать такой вариант.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public frmIncomeTax()
        {
            InitializeComponent();
        }
 
        decimal x;
        decimal inc_tax = 0m;
        decimal exc_over = 0m;
 
        private void txtInput_Changed(object sender, EventArgs e)
        {
            x = 0m;
            x = Decimal.Parse(textBox1.Text, System.Globalization.NumberStyles.AllowCurrencySymbol | System.Globalization.NumberStyles.AllowDecimalPoint | System.Globalization.NumberStyles.AllowThousands);
        }
Теперь программа компилируется без ошибок, и я могу вводить данные типа 50,000.00

Однако, если я пытаюсь ввести $50,000.00 - сразу идет System.FormatException

Почему? Я ведь указал AllowCurrencySymbol

Добавлено через 3 минуты
Ага, понял в чем дело. Знак валюты $ допускается только в конце числа. Т.е. если я ввожу 50,000.00$ - то можно. А если доллар вначале - кирдык.

Это победить как-то можно?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.03.2018, 18:16
Цитата Сообщение от antonvix Посмотреть сообщение
Что на этот раз не так?
Отсутствует предпоследний аргумент — IFormatProvider.
В качестве него обычно передают ссылку на культуру, в соответствии с которой вы хотите парсить.

Цитата Сообщение от antonvix Посмотреть сообщение
Теперь программа компилируется без ошибок, и я могу вводить данные типа 50,000.00
Но если введете "мама мыла раму", то приложение упадет.

Цитата Сообщение от antonvix Посмотреть сообщение
Это победить как-то можно?
Да, передавайте в метод соответствующую культуру.
Если вы считываете доллары, то и передавайте для парсинга культуру Штатов:
C#
1
2
3
4
5
6
7
8
9
10
11
decimal x;
var style = NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands;
var culture = CultureInfo.GetCultureInfo("en-US");
if (decimal.TryParse(textBox1.Text, style, culture, out x))
{
   // Do something with x
}
else
{
   MessageBox.Show("Кривой ввод");
}
1
0 / 0 / 0
Регистрация: 15.03.2018
Сообщений: 11
15.03.2018, 20:16  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Да, передавайте в метод соответствующую культуру.
Если вы считываете доллары, то и передавайте для парсинга культуру Штатов:
Спасибо большое. Ваш код сработал. Странно, почему они не говорят об этом в учебнике, что для начала нужно создавать переменные и парсить используя их.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
15.03.2018, 21:00
Цитата Сообщение от antonvix Посмотреть сообщение
Странно, почему они не говорят об этом в учебнике, что для начала нужно создавать переменные и парсить используя их.
Потому что переменные можно не создавать а сразу в параметры метода при вызове указать...
Вот код, совершенно идентичный коду из поста #5:
C#
1
2
3
4
5
6
7
8
if (decimal.TryParse(textBox1.Text, NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.GetCultureInfo("en-US"), out decimal x))
{
   // Do something with x
}
else
{
   MessageBox.Show("Кривой ввод");
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.03.2018, 21:59
antonvix, как сказал выше товарищ Someone007, переменные создавать не обязательно, но с ними код более читаем.
Особенно, если без них вызов превращается в простыню с прокруткой
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.03.2018, 21:59
Помогаю со студенческими работами здесь

TryParse - как лучше реализовать проверку?
В программе производится ввод чисел (для разных переменных), надо обработать исключение, "если будет введено что-то кроме...

Как в формате денежный изменить валюту
как в формате денежный изменить валюту на другую?

VBulletin Как добавить валюту в управление подпиской?
Понадобилось включить коммерческую подписку в vBulletin 4.2.2 Для начала собираюсь использовать платёжную систему PayPal, но оказалось,...

Как создать свою валюту на сайте
Здравствуйте!Хочу сделать на сайте обмен(например "монетки" на ссылку).Есть ли какие-то сайты чтоб я мог добавлять то что могут обменять за...

Как можно сравнить число со строкой, не используя Parse и TryParse?
Здравствуйте, форумчане. Препод подкинул задачку: разработайте метод для преобразования строки символов с максимальной длиной в 40 знаков...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru