出于某种原因,当我运行“测试”方法时,我得到一个错误的结果。我使用了我关于随机数生成的其他问题中的一些代码,我已经确认这些代码可以正常工作,但还有额外的安全检查。
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;
}
}
}
答案 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()
内置方法,应该(必须)完全从您的程序中删除。不要重新发明轮子。
另一个建议:不要为变量O
或S
命名,而应给它们一个有意义的名称。
答案 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.
}
}