Десятичная точка в калькуляторе c # - PullRequest
3 голосов
/ 23 февраля 2010

Аааааа, ладно, это сводит меня с ума.

Почему, когда моя десятичная точка находится в неправильном месте, например

если у меня есть строка 567 в текстовом поле и я нажимаю десятичную кнопку, я ожидаю (или я хочу), чтобы текстовое поле изменилось на 567. но вместо этого я получаю .567

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

Edit:

Вот весь мой код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Calculator
{
    public partial class frmCurrencyCalc : Form
    {
        public frmCurrencyCalc()
        {
            InitializeComponent();
        }

        private void cmdZero_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "0";
            }
            else
            {
                txtScreen.AppendText("0");
            }
        }
        private void cmd1_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "1";
            }
            else
            {
                txtScreen.AppendText("1");
            }
        }

        private void cmdTwo_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "2";
            }
            else
            {
                txtScreen.AppendText("2");
            }
        }

        private void cmdThree_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "3";
            }
            else
            {
                txtScreen.AppendText("3");
            }
        }

        private void cmdFour_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "4";
            }
            else
            {
                txtScreen.AppendText("4");
            }
        }

        private void cmdFive_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "5";
            }
            else
            {
                txtScreen.AppendText("5");
            }
        }

        private void cmdSix_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "6";
            }
            else
            {
                txtScreen.AppendText("6");
            }
        }

        private void cmdSeven_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "7";
            }
            else
            {
                txtScreen.AppendText("7");
            }
        }

        private void cmdEight_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "8";
            }
            else
            {
                txtScreen.AppendText("8");
            }
        }

        private void cmdNine_Click(object sender, EventArgs e)
        {
            if (txtScreen.Text == "0")
            {
                txtScreen.Text = "9";
            }
            else
            {
                txtScreen.AppendText("9");
            }
        }

       private void cmdDecimal_Click(object sender, EventArgs e)
      {
          txtScreen.AppendText(".");
          cmdDecimal.Enabled = false;
      }


        private void cmdCancel_Click(object sender, EventArgs e)
        {
            txtScreen.Text = "0";
            cmdDecimal.Enabled = true;
        }
    }
}

Ответы [ 6 ]

1 голос
/ 23 февраля 2010

Мой совет - определите бизнес-уровень. В вашем случае - двойная переменная. После нажатия кнопки сначала обновите переменную. Затем отформатируйте значение.

1 голос
/ 23 февраля 2010

RightToLeft выглядит вашей проблемой. Как описано в MSDN,

Свойство RightToLeft используется для международные заявки, где язык написан с права на слева, например иврит или арабский. когда это свойство установлено в RightToLeft .. ::. Да, элементы управления включающие текст отображаются из справа налево.

Как было предложено в одном из предыдущих ответов, для него должно быть установлено значение false, но с TextAlign установлено значение Right для имитации внешнего вида реального калькулятора.

1 голос
/ 23 февраля 2010

Мой совет - установить TextAlign на право, но оставить RightToLeft на №

Изменить: Сказав, что эта проблема может быть не связана с этими настройками.

Я помню, как у друга была ошибка, похожая на эту, еще в начале 2009 года в Visual Studio 2008 в Windows Vista. Как ни странно, такая же проблема не возникала в той же версии Visual Studio в Windows XP.

Если вы не обновили Visual Studio / .NET 3.5 до Пакет обновления 1 , я предлагаю сделать это и посмотреть, решит ли это проблему.

0 голосов
/ 23 февраля 2010

Просто чтобы вы все знали, кому это интересно.

Мне удалось как-то это исправить. Все, что я сделал, это удалил объект справа налево в коде проекта, а затем перестроил его (используя графический интерфейс) вправо, и это сработало ... странно, так как я не делал ничего другого в прошлый раз ...

Ну хорошо

Спасибо всем за помощь

Очень ценится

х

0 голосов
/ 23 февраля 2010

Я думаю, у вас есть кое-что здесь.

Судя по всему, вы установили:

txtScreen. справа налево = true;

Если вы добавите только десятичную точку, вы получите результат, который вы описали. Попробуйте использовать что-то вроде:

txtScreen.AppendText (»00" .);

Это даст вам результат, который вы описываете.

Возможно, вы открываете банку с червями. Когда вы начинаете форматировать текстовое поле, вы меняете его с хранения значения на представление. Например:

decimal value = 567;
txtScreen.Text = value.ToString("0.00");

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

0 голосов
/ 23 февраля 2010

Возможно, попробуйте другой метод:

private void AddDecimal()
{
    txtScreen.SelectionLength = txtScreen.TextLength;
    txtScreen.SelectedText += ".";
}

(Также ваше текстовое поле, текстовое обозначение, выровнено по правому краю ... если нет, это может способствовать вашей проблеме.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...