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