C# 你能在不知道两个数字所代表的数据类型的情况下比较两个存储为字符串的数字吗?

C# 你能在不知道两个数字所代表的数据类型的情况下比较两个存储为字符串的数字吗?,c#,numbers,string-comparison,C#,Numbers,String Comparison,如果我有两个数字表示为字符串,“100”和“200”,“100.1”和“200.1”,我如何比较它们,看它们是否更大 是否有一个通用编号。比较(stringA,stringB)来处理数据类型?我使用一个数据库条目来确定验证规则,但是值可能是长的、十进制的、浮点的等等,所以我不能创建一个 是否有一个通用编号。比较(stringA,stringB)将 关心数据类型 不,没有通用数字比较。你应该知道号码的类型。例如,不能将浮点数为“100.1”的字符串解析为整数。我会将字符串解析为小数或双精度(这将处

如果我有两个数字表示为字符串,“100”和“200”,“100.1”和“200.1”,我如何比较它们,看它们是否更大

是否有一个通用编号。比较(stringA,stringB)来处理数据类型?我使用一个数据库条目来确定验证规则,但是值可能是长的、十进制的、浮点的等等,所以我不能创建一个

是否有一个通用编号。比较(stringA,stringB)将 关心数据类型

不,没有通用数字比较。你应该知道号码的类型。例如,不能将浮点数为“100.1”的字符串解析为整数。我会将字符串解析为小数或双精度(这将处理“100”和“100.1”),然后比较结果。用于从两个数字中变大:

var max = Math.Max(Double.Parse("100.1"), Double.Parse("200"));
使用此选项是因为这样可以确保如果字符串不是数字,则不会使用linq轻松地将其放大

var numbers = new string[] {  "100" ,"200", "100.1" , "200.1" };
double max = numbers.Max(n => double.Parse(n));
另一个只需字符串操作的解决方案

int N = 100;
var max = numbers.Select(n => n.Split('.'))
                 .OrderByDescending(p => p[0].PadLeft(N,'0'))
                 .ThenByDescending(p => p.Length > 1 ? p[1].PadRight(N, '0') : "")
                 .Select(p => p.Length > 1 ? p[0] + "." + p[1] : p[0])
                 .First();

任何表示为字符串的数字都应该可以转换为双精度。

解析它们。要么使用已有的解析器,要么手动,后者可能会很棘手,因为你可以反复地告诉我格式可能是所有事情,这可能是科学记数法。

如果您将类型声明为
十进制
,即使
数字没有小数点
,这也会起作用,就像有
小数点一样。这也会起作用

var strNumbers = new string[] 
{ 
   "100", 
   "200",
   "100.1", 
   "200.1" 
};
decimal maxVal = numbers.Max(m => decimal.Parse(m));

你试过int.parse或int.tryparse吗?到目前为止,你试过什么?您是否尝试过
顺序比较
?如果您不确定小数位,您可以将它们转换为双精度(使用
double.Parse()
)并以这种方式进行比较。您需要什么分辨率?显而易见的答案是将其解析为double,但也有一些边缘情况(数字太长,double表示没有足够的有效数字)。@CAbbott这可能有效,但也有很多边缘情况下,数字太大,这不起作用。Muchobrig提出了一些积极的建议,在发布答案之前,最好确保答案/解决方案是可行的,也就是说,在发布答案之前,您应该在您的机器上测试代码,这就是为什么这里的一些人表示感谢。你救了我一天。