C# 数字不是数字吗?

C# 数字不是数字吗?,c#,numbers,C#,Numbers,由于某种原因,当我运行“test”方法时,我得到了一个错误的结果。我使用了关于随机数生成的另一个问题中的一些代码,我已经确认了这些代码确实有效,但需要额外的安全检查 public class strUtls { public void test() { var maybe = 40000000f * 40000000f; bool number = isNumber(maybe); } public bool isNumber(o

由于某种原因,当我运行“test”方法时,我得到了一个错误的结果。我使用了关于随机数生成的另一个问题中的一些代码,我已经确认了这些代码确实有效,但需要额外的安全检查

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;
        }
    }
}
公共类结构
{
公开无效测试()
{
var可能=40000000f*40000000f;
bool number=isNumber(可能);
}
公共布尔isNumber(对象O)
{
//INT16,INT32,INT64,双精度,浮点型
if(upper(O.GetType().ToString()).Contains(“INT”)| | upper(O.GetType().ToString()).Contains(“DOUBLE”)| | upper(O.GetType().ToString()).Contains(“FLOAT”))
{
返回true;
}
其他的
{
返回false;
}
}
专用字符串上限(字符串s)
{
尝试
{
对于(int i=0;i
C#
浮点的实际类型名称是
Single
,这就是为什么浮点检查失败的原因。更直接的测试是使用
is
或直接
类型
比较:

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

// ...

return validNumericTypes.Contains(O.GetType());
private static HashSet validNumericTypes=新HashSet{
typeof(int)、typeof(uint)、typeof(short)、typeof(ushort)、typeof(long),
//等等。
};
// ...
返回validNumericTypes.Contains(O.GetType());

当然,我不知道你为什么要测试C的算术运算是否正确。

你做错了

不要用这样的硬编码字符串测试你的类型。使用

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;
而且

case ('s'):
    return S;
    break;
应该由

s = s.ToUpper();
case ('s'):
    return 'S';
    break;
case ('s'):
    return 'S';
实际上应该用

s = s.ToUpper();
case ('s'):
    return 'S';
    break;
case ('s'):
    return 'S';
由于
.ToUpper()
内置方法,应该(必须)从程序中完全删除哪个。不要再发明轮子了

另一条建议:不要给变量命名为
O
S
,而是给它们一个有意义的名称

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


您可以更改字符串的大小写,如下所示:

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;
}
你只要写

return x * y;

对于isNumber,您应该尝试使用Double.TryParse。i、 e

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

对于任何可以转换为双精度的值,包括Int、Single/double或String(如果可以将其解析为数字的话),都应该返回true。

将疯狂简化一点,找到答案的最简单方法是检查字符串的内容。其他人现在已经概述了正确的方法。我发布这篇文章是为了给你一个更好的方法来构造相同的代码。顺便说一句,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.
    }
}

这看起来是个疯狂的想法。我不确定该怎么做。为什么要重写内置函数?case('s'):返回s;你是说退货吗?为什么不使用String.toUpper()?很多事情都错了…这个代码在很多方面都错了<代码>大小写('s'):返回s
,首先:指出当前缺少无符号类型(包括
byte
)。
var可能=40000000f*40000000f始终是一个
浮点数
。即使它应该
double val;
return Double.TryParse(O.toString(), out val);
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.
    }
}