将十六进制转换为十进制

时间:2012-03-26 21:53:29

标签: c#

我目前正在使用C#构建转换器。我的程序是从/转换为十进制,二进制和十六进制。我的问题是在某些特定情况下结果不正确。

示例:

FFFFF (hexa)到十进制= 148575 (真实回答:1048575)

20000 (十进制)到十进制= 20 (真实答案:不需要计算器:P)

此外,我不能使用任何Convert.ToString,因为它适用于学校,我的老师要求我们操纵变量并使用功能。

我认为我的convertToString()函数会导致某处丢失零的问题。

private string convertToString(int value)
{
    string result = "";
    string tmp = "";
    int y = 0;

    while (value != 0) {
        int valeur = value;
        y = 0;
        while (valeur > 9) {
            valeur = valeur / 10;
            y++;
        }
        switch (valeur) {
            case 0:
                tmp = "0";
                break;
            case 1:
                tmp = "1";
                break;
            case 2:
                tmp = "2";
                break;
            case 3:
                tmp = "3";
                break;
            case 4:
                tmp = "4";
                break;
            case 5:
                tmp = "5";
                break;
            case 6:
                tmp = "6";
                break;
            case 7:
                tmp = "7";
                break;
            case 8:
                tmp = "8";
                break;
            case 9:
                tmp = "9";
                break;
        }
        value = (int)(value - (valeur * Math.Pow(10, y)));
        result = result + tmp;
    }

    if (y != 0) {
        result = result + "0";
    }
    return result;
}

提前谢谢。

5 个答案:

答案 0 :(得分:3)

我建议你在调试器中逐步执行代码,检查控制流程。您还应该使用“局部”窗口检查变量的值。您将看到您创建的算法与您认为创建的算法的不同之处。

另一种有用的技术是将现有方法分解为执行任务的更简单部分的较小方法。给出描述他们正在执行的任务部分的方法名称。这样可以更容易地更改逻辑(例如,当您了解将数字转换为字符的更好方法时!)。祝你好运。

答案 1 :(得分:2)

使用一个简单的数字,如value = 123或value = 103,然后逐步执行代码。

您可以使用调试器单步执行并观察变量的值来执行此操作,但如果您想真正了解代码的工作原理,请使用您自己的大脑作为CPU,看看您是否可以在一块纸。

当您逐步完成操作时,您将能够看到数字发生了什么,并且可以观察出现错误的确切时刻,以便了解正在发生的事情。

答案 2 :(得分:0)

这里失0:

while(valeur> 9) {     valeur = valeur / 10;     ÿ++; }

您继续将数字除以小于9,然后使用变量y递增计数。

然后你不能用它来取回它: value =(int)(value - (valeur * Math.Pow(10,y)));

我不知道这个函数的意义是什么,我猜测ToString而不使用内置函数,如果是这样的话,这是使用StringBuilder和Int数组的一种方法:

private string convertToString(int value)
{
    int[] valueAsArray = digitArr(value);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < valueAsArray.Length; i++)
    {
        sb.Append(valueAsArray[i]);
    }
    return sb.ToString();
}

public static int[] digitArr(int n)
{
    if (n == 0) return new int[1] { 0 };
    var digits = new List<int>();

    for (; n != 0; n /= 10)
    {
        digits.Add(n%10);
    }
    var arr = digits.ToArray();
    Array.Reverse(arr);
    return arr;
}

当你的老师在这里检查时,我会敦促你以这种方式修复你自己的功能,他看到你付出了努力,然后使用调试器解决这个问题,如phong所提到的......

答案 3 :(得分:0)

问题是你用英文和法文两个同名意思创建混淆:value / valeur;

您可以像这样计算小数位数

string result = "";
bool minus = false;
if (value == 0 ) {
    result = "0";
} else {
    // Begin the string with a minus (`-`) if value is negative
    // and continue the conversion with a positive value.
    if (value < 0) {
         minus = true;
         value = - value;
    }

    // Add decimals to the result as long as the remaining number is not zero.
    while (value > 0) { 
        // Get last decimal using the modulo operator
        int lastDecimal = value % 10;

        // Prepend the decimal to the result after having converted it to a character
        result = (char)('0' + lastDecimal) + result;

        // Divide the value by 10. Integer division!
        value = value / 10;
    }
    if (minus) {
        result = "-" + result;
    }
}

答案 4 :(得分:0)

这是一个很好的例子,当你有一个已知的良好函数,并且你想要针对它测试自己的实现。这段代码怎么可能:

        for (int i = 0; i < 100000; i++)
        {
            if (i.ToString() != ConvertToString(i))
            {
                Console.WriteLine(i);
                ConvertToString(i);
            }
        }
你帮忙吗?首先,它会告诉您哪些数字不适用于您的方法。其次,您可以将调试器附加到WriteLine行,然后逐步执行您的方法。

以下是使用Math.Log10Math.Pow的示例。使用调试器逐步执行它,看看为什么它不会丢弃任何零(它最初都是这样做的,但很明显为什么在使用查看哪些情况失败后,然后使用调试器)。

    static string ConvertToString(int value)
    {
        string result = "";
        int power = (int)Math.Log10(value);
        while (power >= 0)
        {
            int nextLowestPowerOfTen = (int)Math.Pow(10, power);
            int lowestMultipleOfPowerOfTen = (int)(value / nextLowestPowerOfTen);
            result += lowestMultipleOfPowerOfTen;
            value -= lowestMultipleOfPowerOfTen * nextLowestPowerOfTen;
            power--;
        }
        return result;
    }