号码不是号码?

时间:2012-02-02 19:21:23

标签: c# numbers

出于某种原因,当我运行“测试”方法时,我得到一个错误的结果。我使用了我关于随机数生成的其他问题中的一些代码,我已经确认这些代码可以正常工作,但还有额外的安全检查。

public class strUtls
{
    public void test()
    {
        var maybe = 40000000f * 40000000f;
        bool number = isNumber(maybe);
    }

    public bool isNumber(object O)
    {
        // INT16,INT32,INT64,DOUBLE,FLOAT
        if (upper(O.GetType().ToString()).Contains("INT") || upper(O.GetType().ToString()).Contains("DOUBLE") || upper(O.GetType().ToString()).Contains("FLOAT"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    private string upper(string s)
    {
        try
        {
            for (int i = 0; i < s.Length; i++)
            {
                s = s.Replace(s[i], upper(s[i]));
            }

            return s;
        }
        catch (IndexOutOfRangeException)
        {
            return s;
        }
    }

    private char upper(char S)
    {
        switch (s)
        {
            case ('a'):
                return 'A';
                break;
            case ('b'):
                return 'B';
                break;
            case ('c'):
                return 'C';
                break;
            case ('d'):
                return 'D';
                break;
            case ('e'):
                return 'E';
                break;
            case ('f'):
                return 'F';
                break;
            case ('g'):
                return 'G';
                break;
            case ('h'):
                return 'H';
                break;
            case ('i'):
                return 'I';
                break;
            case ('j'):
                return 'J';
                break;
            case ('k'):
                return 'K';
                break;
            case ('l'):
                return 'L';
                break;
            case ('m'):
                return 'M';
                break;
            case ('n'):
                return 'N';
                break;
            case ('p'):
                return 'O';
                break;
            case ('o'):
                return 'P';
                break;
            case ('q'):
                return 'Q';
                break;
            case ('r'):
                return 'R';
                break;
            case ('s'):
                return S;
                break;
            case ('t'):
                return 'T';
                break;
            case ('u'):
                return 'U';
                break;
            case ('v'):
                return 'V';
                break;
            case ('w'):
                return 'W';
                break;
            case ('x'):
                return 'X';
                break;
            case ('y'):
                return 'Y';
                break;
            case ('z'):
                return 'Z';
                break;
            default:
                return s;
                break;
        }
    }
}

5 个答案:

答案 0 :(得分:5)

C#float的实际类型名称是Single,这就是您对浮动的检查失败的原因。更直接的测试是使用is或直接Type比较:

private static HashSet<Type> validNumericTypes = new HashSet<Type> { 
    typeof(int), typeof(uint), typeof(short), typeof(ushort), typeof(long),
    // etc.
};

// ...

return validNumericTypes.Contains(O.GetType());

当然,我不知道为什么你必须测试C#是否正确进行算术运算。

答案 1 :(得分:4)

public bool IsNumber(object o) 
{ 
    return o is Int16 || o is Int32 || o is Int64 || o is Double || o is Single;
} 

public bool IsNumber(object o) 
{ 
    return o is short || o is int || o is long || o is double || o is float;
} 

您可以更改字符串的大小写:

string s = "Hello World";
string upper = s.ToUpper();
string lower = s.ToLower();

编辑:如果您仍想将自己的Upper方法作为练习实施,请不要单独处理每个字母,而是计算其值。每个字符都有一个相应的数值。例如。 (int)'A' == 65。算术操作未在类型char上定义,但是,C#会自动将字符转换为int以允许操作。因此,结果必须返回char

private char Upper(char ch)
{
    if (ch >= 'a' && ch <= 'z') {
        return (char)(ch + 'A' - 'a');
    }
    return ch;
}

如果我们将字符串转换为字符数组

,我们可以避免代价高昂的字符串连接
private string Upper(string s)
{
    var characters = s.ToCharArray();
    for (int i = 0; i < characters.Length; i++) {
        characters[i] = Upper(characters[i]);
    }
    return new String(characters);
}

if (<boolean expression>) {
    return true;
} else {
    return false;
}

可以简单地表达为

return <boolean expression>;

因为布尔表达式导致类型bool的值,所以可以立即返回此值。你不写

if (x * y == 0) {
    return 0;
} else if (x * y == 1) {
    return 1;
} else if (x * y == 2) {
    return 2;
} else if (x * y == 3) {
    return 3;
} ....

你只需写

return x * y;

答案 2 :(得分:2)

你做错了。

请勿使用类似硬编码的字符串测试您的类型。使用

if (O is int)
{       
}

if (O is float)
{
}

代替。

float实际上是System.Single的C#别名,这实际上是您代码的(问题之一)问题。


为了完整起见:

for (int i = 0; i < s.Length; i++)
{
    s = s.Replace(s[i], upper(s[i]));
}

return s;

必须替换为

s = s.ToUpper();

另外,

case ('s'):
    return S;
    break;

应替换为

case ('s'):
    return 'S';
    break;

实际应该被

取代
case ('s'):
    return 'S';

由于.ToUpper()内置方法,应该(必须)完全从您的程序中删除。不要重新发明轮子。

另一个建议:不要为变量OS命名,而应给它们一个有意义的名称。

答案 3 :(得分:2)

对于isNumber,您应该尝试使用Double.TryParse。即。

double val;
return Double.TryParse(O.toString(), out val);

对于可以转换为double的任何值,如果可以将其解析为数字,则返回true,包括Int,Single / Double或String。

答案 4 :(得分:0)

稍微简化一下疯狂,找到答案的最简单方法是检查字符串的内容。其他人现在已经概述了正确的方法。我只是发布这个,以便让您了解构建相同代码的更好方法。顺便说一下,String已经有一个ToUpper()方法。

class Program
{
    static void Main(string[] args)
    {
        var maybe = 40000000f * 40000000f;
        Console.WriteLine(isNumber(maybe));
        Console.ReadLine();
    }

    public static bool isNumber(object O)
    {
        var s = O.GetType().ToString().ToUpper();
        Console.WriteLine(s); // prints "SINGLE"
        // this is silly
        //return (s.Contains("INT") || s.Contains("DOUBLE") || s.Contains("SINGLE"));
        // better
        return O is int || O is Int64 || O is float || O is double; // etc.
    }
}