【问题标题】:choosing different conversions in a c# application在 c# 应用程序中选择不同的转换
【发布时间】:2014-01-23 15:23:58
【问题描述】:

我有一个转换长度的 c# 应用程序。如果用户输入以点分隔的数字 (3.45),则应用程序可以正常工作并给出正确的结果,但如果用户输入逗号 (3,45),则会给出错误的结果。有谁知道我如何解决这个问题

    private void butCal_Click(object sender, EventArgs e)
    {
        // initialising and declaring variables 

        double miles, kilometres, feet, metres, inches, centimetres = 0;

        // the if statements initiates an event handler to select items from the conversions (combobox) to do conversion

        if (Conversions.Text == "Miles to Kilometres")
        {
            if (!double.TryParse(txtNumber.Text, out miles)) // verifies that the string entered is a number
            {
                MessageBox.Show("Please enter a number !"); // displays message if no number is entered
            }

            // Logic for doing calculations
            kilometres = miles * 1.6093; 
            txtAnswer.Text = kilometres.ToString("N2") + " Kilometres"; // displays the answer and rounds it off to two decimals

            txtAnswer.Visible = true;
            txtAnswer.Enabled = false;
            lblAnswer.Text = " Answer = ";
            lblAnswer.Visible = true;
        }

        else if (Conversions.Text == "Kilometres to Miles")
        {
            if (!double.TryParse(txtNumber.Text, out kilometres))
            {
                MessageBox.Show("Please enter a number.");
            }
            miles = kilometres * 0.621;
            txtAnswer.Text = miles.ToString("N2") + " miles ";

            txtAnswer.Visible = true;
            txtAnswer.Enabled = false;
            lblAnswer.Text = " Answer = ";
            lblAnswer.Visible = true;
        }
        else if (Conversions.Text == "Feet to Metres")
        {
            if (!double.TryParse(txtNumber.Text, out feet))
            {
                MessageBox.Show("Please enter a number.");
            }
            metres = feet * 0.3048;
            txtAnswer.Text = metres.ToString("N2") + " metres ";

            txtAnswer.Visible = true;
            txtAnswer.Enabled = false;
            lblAnswer.Text = " Answer = ";
            lblAnswer.Visible = true;
        }

        else if (Conversions.Text == "Metres to Feet")
        {
            if (!double.TryParse(txtNumber.Text, out metres))
            {
                MessageBox.Show("Please enter a number.");
            }
            feet = metres * 3.280839895;
            txtAnswer.Text = feet.ToString("N2") + " Ft ";

            txtAnswer.Visible = true;
            txtAnswer.Enabled = false;
            lblAnswer.Text = " Answer = ";
            lblAnswer.Visible = true;
        }

        else if (Conversions.Text == "Inches to Centimetres")
        {
            if (!double.TryParse(txtNumber.Text, out inches))
            {
                MessageBox.Show("Please enter a number.");
            }
            centimetres = inches * 2.54;
            txtAnswer.Text = centimetres.ToString("N2") + " cm ";
        }

        else if (Conversions.Text == "Centimeters to Inches")
        {
            if (!double.TryParse(txtNumber.Text, out centimetres))
            {
                MessageBox.Show("Please enter a number.");
            }
            inches = centimetres * 0.3937;
            txtAnswer.Text = inches.ToString("N2") + " Inches ";

            txtAnswer.Visible = true;
            txtAnswer.Enabled = false;
            lblAnswer.Text = " Answer = ";
            lblAnswer.Visible = true;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // resetting all labels, text fields and the conversion (combobox)
        Conversions.SelectedIndex = -1;
        txtNumber.Clear();
        txtAnswer.Clear();
        butCal.Visible = false;

        // Hidding text fields and labels until they are called
        txtAnswer.Visible = false;
        txtNumber.Visible = false;
        lblAnswer.Visible = false;
        lblNumber.Visible = false;
    }

    private void butExit_Click(object sender, EventArgs e)
    {
        Close(); // exits the application
    }

【问题讨论】:

  • 你不能在开头用.替换,。请详细说明错误的结果
  • @NitinVarpe - 不,因为3,100 表示3.100,它表示3100(或其他方式,取决于你碰巧住在哪里).. ..

标签: c#


【解决方案1】:

double.TryParse 具有采用文化或数字样式的重载。

http://msdn.microsoft.com/en-us/library/3s27fasw(v=vs.110).aspx

对于IFormatProvider provider 参数,您可以使用 CultureInfo.InvariantCulture 作为点

【讨论】:

    【解决方案2】:

    如果您专门谈论 (3,45),则可以抛出错误,因为 3,45 可能没有任何意义。如果您希望它正常工作,则使用@selman22 的解决方案,否则,如果您确认用户输入的输入将是标准之一,即 , 将用于分隔数千个,则使用此处给出的解决方案@987654321 @ 类似于 double 或 @Softlion 给出的解决方案

    【讨论】:

    • 这里的问题是3,45仍然被认为是一个有效的数字。根据用户的区域设置,它将被(错误)解释为3.45345。那么什么时候抛出错误呢?
    【解决方案3】:
    var text = txtNumber.Text;
    if(text.IndexOf(',') > 0)
    {
       text = text.Replace(',','.');
    }
    

    【讨论】:

    • 如果输入1,23.3 :) 会怎样?为什么还要麻烦 - 答案都是 42 所以text = "42" 保证正确的解析和可靠的结果。
    • 这是一个特例 :D 然后我们需要做一些额外的验证,但 OP 没有问。
    【解决方案4】:

    考虑到您的要求。你可以试试下面的方法

       try
    {
        double.Parse(txtNumber.Text, CultureInfo.InvariantCulture)
    }
    catch(Exception ae)
     {
                MessageBox.Show("Not a Number")
     }
    

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2022-08-18
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2010-09-29
      • 2016-07-16
      相关资源
      最近更新 更多