Nano Hash - криптовалюты, майнинг, программирование

Windows Forms С# - Ввод денег в текстовое поле с динамической маской

Windows Forms С#. Я хотел бы создать текстовое поле, которое автоматически изменяется каждый раз, когда пользователь вводит или удаляет один ключ из текстового поля. Я разработал часть кода.

    //This will convert value from textbox to currency format when focus leave textbox
    private void txtValormetrocubico_Leave(object sender, EventArgs e)
    {
        decimal cubic = Convert.ToDecimal(txtValormetrocubico.Text);
        txtValormetrocubico.Text = string.Format("{0:c}", Convert.ToDecimal(cubic));
        MessageBox.Show(txtValormetrocubico.Text);
    }


    //this only allow numbers and "." and "," on textimbox imput
    private void txtValormetrocubico_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!char.IsControl(e.KeyChar)
    && !char.IsDigit(e.KeyChar)
    && e.KeyChar != '.' && e.KeyChar != ',')
        {
            e.Handled = true;
        }

        // only allow one decimal point
        if (e.KeyChar == '.'
            && (sender as TextBox).Text.IndexOf('.') > -1)
        {
            e.Handled = true;
        }

            if (e.KeyChar == ','
                && (sender as TextBox).Text.IndexOf(',') > -1)
            {
                e.Handled = true;
            }          
    }

Когда я в первый раз ввожу значение в текстовое поле, значение идеально преобразуется в денежный формат, например, 300 в $ 300.00. Но я снова редактирую это значение текстового поля и нажимаю ввод, это дает ошибку: «Входная строка не была в правильном формате», указывающая на строку ниже:

decimal cubic = Convert.ToDecimal(txtValormetrocubico.Text);

Я думаю, что проблема вызвана тем, что значение уже в десятичном формате. Поэтому, когда я нажимаю на поле и снова нажимаю ввод, это вызывает ошибку, потому что значение не может быть проанализировано. Как мне избежать этой ошибки?

EDIT: Мой предыдущий вопрос был моим первым. Поскольку я новый пользователь и не очень хорошо разбираюсь в C#, я забыл опубликовать свой код. Изучив еще немного, я заставил часть этого работать. Остается только эта маленькая проблема. Пожалуйста, проголосуйте, я был забанен и не могу задавать новые вопросы, потому что у меня было 7 голосов против.

Спасибо ребята.


  • не понял, почему он был закрыт, я думаю, что мой вопрос слишком ясен. 13.04.2013
  • О, это очень ясно. Ты не просил помощи. Вы просили, чтобы кто-то сделал код для вас. Это не сайт для этого. В следующий раз попробуйте задать вопрос о возникшей проблеме и показать код, который вы использовали. Вы ничего подобного не публиковали. Кроме того, вы не указали платформу: web, winforms, wpf и т. д. Надеюсь, это поможет. 13.04.2013
  • Хорошо, меня забанили, потому что у меня было 7 голосов, теперь я не могу задавать новые вопросы. Поскольку я новый пользователь stackoverflow и мало знаю о C#, в предыдущем вопросе я не добавлял никакого кода, поэтому я больше изучаю и смог заставить код работать, но только с 1 ошибкой во время выполнения. Пожалуйста, проголосуйте, чтобы разблокировать моего пользователя. Спасибо всем, ребята. 17.04.2013
  • +1 за дополнительное изучение и возвращение, чтобы улучшить свой вопрос :) Не забудьте указать свою платформу, например, упомянутую выше LarsTech. 17.04.2013
  • @felipeSalomao проголосовал за 17.04.2013
  • Спасибо за это, уже было 2 голоса, осталось 5. В заголовке я сказал C #. Еще раз спасибо ребята 17.04.2013
  • Существует отдельная категория для голосования за возобновление работы. Вопрос будет открыт повторно, если он получит еще один голос в этой категории. Кстати, платформа имела в виду комментарий LarsTech: * Кроме того, вы не указали платформу: web, winforms, wpf и т. д. * 17.04.2013
  • Сейчас разобрался, отредактировал, его окна формируются. Сорри за нуба, это мои первые посты. Спасибо за это 18.04.2013
  • Пожалуйста, проголосуйте, теперь все в порядке, и у меня -4 голоса 30.04.2013
  • @felipeSalomao есть еще вопросы? Я ответил на ваш вопрос или я неправильно его понял? Оставьте комментарий, и я постараюсь помочь. 15.05.2013

Ответы:


1

Проблема в том, что строка содержит символ валюты

private void TextBox_LeaveEvent(object sender, EventArgs e)
{
    var tb = sender as TextBox;
    if(tb.Text.Length>0){
        decimal cubic = Convert.ToDecimal(tb.Text);
        tb.Text = string.Format("{0:c}", Convert.ToDecimal(cubic));
        label1.Text = tb.Text;
    }
}

Над текстовым полем. Текст содержит информацию о валюте:

tb.Text = string.Format("{0:c}", Convert.ToDecimal(cubic));

Поскольку текстовое поле теперь содержит символ валюты (например, € или $), Convert.ToDecimal завершается ошибкой, как только TextBox_LeaveEvent снова срабатывает:

decimal cubic = Convert.ToDecimal(tb.Text);

Если вы bing for c# masked textbox, вы можете найдите статьи о маскированных текстовых полях. Вы также можете проверить, содержит ли строка какие-либо нечисловые символы (if(tbText.IndexOf(" ") >-1){...})

Обновление с базовым примером

Я загрузил очень простой пример удаления форматирования валюты на github. :

string RemoveCurrencyFormating(string input)
{    
    if(input.IndexOf(" ") !=-1){
       var money = input.Substring(0, input.IndexOf(" ")-1);            
       return String.Format("{0:D0}", money);               
    }
    return ""; // Todo: add Error Handling
}

В TextBox Enter Event вы можете сделать следующее:

void TextBox_EnterEvent(object sender, EventArgs e)
{
    var tb = sender as TextBox;
    tb.Text = RemoveCurrencyFormating(tb.Text);
}
04.05.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..