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

本文关键字:int 第一个 数字 获取 自定义 | 更新日期: 2023-09-27 18:31:47

我正在尝试在我的猜测数字游戏中构建一个帮助函数,用户获得他/她必须猜测的数字的第一个数字。因此,如果生成的数字是 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);
        }
    }
 }

在帮助按钮下单击我有:

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

这是我的最新尝试,我将所有这些放在一个自定义类中。总的来说,我输入了代码以显示helpMe字符串中的内容。

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

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

为什么不对数字进行 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))));

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

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

变化:

  • 使用int double,这样可以使您远离一大堆潜在的精度问题。
  • 使用 >= 运算符而不是 > 。如果您得到的值10则希望循环继续进行另一次迭代以获得一位数。
  • 您将使用 Math.Floor 而不是 Math.Round,因为您不希望将第一个数字四舍五入,即获取460的第一个数字作为5。但是,如果您使用的是整数,则除法会截断结果,因此根本不需要进行任何舍入。
  • 值除以并将其存储回同一变量中。
  • 循环后使用该值,在变量中仍有多个数字的情况下更新它是没有意义的。

法典:

int test = (int)globalVariableNumber.number;
while (test >= 10) {
  test = test / 10;
}
globalVariableNumber.helpMe = test.ToString();

通过使用 Math.Round(),在您的示例中,您将 5.5 四舍五入到 6(这是每个文档中的偶数整数)。 改用 Math.Floor,这将删除小数点,但为您提供此测试所需的数字。

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

不过,就像 Greenhalgh 提到的@Sam的那样,将数字的第一个字符作为字符串返回会更干净、更快、更容易。

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.
}