C#在自定义类中获取int的第一个数字

时间:2014-11-24 12:50:25

标签: c# visual-studio

我正在尝试在我猜数字游戏中构建一个帮助功能,即用户获得他/她必须猜测的数字的第一个数字。因此,如果生成的数字是550,他将获得5。

我尝试了很多东西,也许你们其中一个人知道出了什么问题?

public partial class Class3
{
    public Class3()
    {
        double test = Convert.ToDouble(globalVariableNumber.number);
        while (test > 10)
        {
            double firstDigit = test / 10;
            test = Math.Round(test);
            globalVariableNumber.helpMe = Convert.ToString(firstDigit);
        }

    }

 }

在helpButton下单击我有:

    private void helpButton_Click(object sender, EventArgs e)
    {
       label3.Text = globalVariableNumber.helpMe;
        label3.AutoSize = true;

这是我最近的尝试,我把所有这些都放在了自定义类中。在主要内容中,我推出了代码以显示helpMe字符串中的内容。

如果您需要更多代码,请告诉我

4 个答案:

答案 0 :(得分:2)

为什么不ToString数字并使用Substring来获取第一个字符?

var number = 550;
var result = number.ToString().Substring(0, 1);

如果由于某种原因你不想使用字符串操作,你可以像这样在数学上做到这一点

var number = 550;
var result = Math.Floor(number / Math.Pow(10, Math.Floor(Math.Log10(number))));

答案 1 :(得分:1)

出了什么问题 - 你在那里有一个无限的循环。 Math.Round(test)将在第一次迭代后保持测试值不变。 您可能打算使用firstDigit作为控制循环的变量。 无论如何,正如其他人所建议的那样,您可以通过转换为字符串并使用第一个字符将helpMe设置为第一个数字。 另外,您应该考虑提供数字作为参数并从方法返回helpMe字符串。你目前的方法有点脆弱。

答案 2 :(得分:1)

您的代码的问题在于您正在进行除法并将其存储在单独的变量中,然后您将原始值四舍五入。这意味着原始值仅在循环的第一次迭代中发生变化(并且仅舍入,而不是分割),除非发生使循环条件为假(即对于10到10.5之间的值),否则循环将永远不会结束

的变化:

  • 使用int的{​​{1}}整数,可以帮助您摆脱一大堆潜在的精确问题。
  • 使用double运算符而不是>=。如果得到值>,那么您希望循环继续进行另一次迭代以获得单个数字。
  • 您可以使用10代替Math.Floor,因为您不希望将第一个数字向上舍入,即将Math.Round的第一个数字设为460。但是,如果使用整数,则除法会截断结果,因此根本不需要进行任何舍入。
  • 将值除以并将其存储回相同的变量中。
  • 使用循环后的值,在变量中仍有多个数字时更新它没有意义。

代码:

5

答案 3 :(得分:0)

通过使用Math.Round(),在您的示例中,您将舍入5.5到6(它是每the documentation的偶数整数)。请使用Math.Floor,这将删除小数点,但会为您提供此测试所期望的数字。

double test = Convert.ToDouble(globalVariableNumber.number);
    while (test > 10)
    {
        test = Math.Floor(test / 10);
        globalVariableNumber.helpMe = Convert.ToString(firstDigit);
    }

就像@Sam Greenhal提到的那样,将数字的第一个字符作为字符串返回将更清晰,更快捷,更容易。

globalVariableNumber.helpMe = test >= 10 
                            ? test.ToString().SubString(0, 1) 
                            : "Hint not possible, number is less than ten"

这假设helpMe是一个字符串。

根据我们在评论中的讨论,你最好这样做:

private void helpButton_Click(object sender, EventArgs e)
{
   label3.Text = GetHelpText();
   label3.AutoSize = true;
}

// Always good practice to name a method that returns something Get...
// Also good practice to give it a descriptive name.
private string GetHelpText()
{
    return test >= 10    // The ?: operator just means if the first part is true...
           ? test.ToString().SubString(0, 1)   // use this, otherwise...
           : "Hint not possible, number is less than ten" // use this.
}