C#如何将字符串数组中的数字字符串解析为double类型进行数值比较
问题根源
string.Compare的逻辑是逐字符对比字典序,和数值大小的判断逻辑完全不同。比如对比字符串"8"和"13"时,第一个字符'1'的ASCII码小于'8',会错误返回"13更小"的结果,根本满足不了数值比较的需求。- 你的月份数组里的小数同时存在逗号(如
Marec 4,5)和点(如Apríl 8.3)两种小数分隔符,直接调用double.Parse会默认使用当前系统的区域格式规则,遇到不匹配的分隔符就会抛出格式错误,无法正常转成数值类型。
修复方案
核心思路是先把所有字符串里的数字部分统一格式,转成double类型后,直接用> <等数值运算符比较,不要用字符串比较方法处理数值判断。
可直接运行的修复代码
using System; class MonthNumberTest { static void Main() { string[] Months = new string[12]; Months[0] = "Január 1"; Months[1] = "Február 0"; Months[2] = "Marec 4,5"; Months[3] = "Apríl 8.3"; Months[4] = "Máj 13"; Months[5] = "Jún 17.3"; Months[6] = "Júl 20.5"; Months[7] = "August 21"; Months[8] = "September 15"; Months[9] = "October 8"; Months[10] = "November 4"; Months[11] = "December 1.4"; // 封装通用的数字提取转换方法 double ExtractNumber(string monthStr) { // 截取空格后的数字部分,去除首尾空白 int splitPos = monthStr.IndexOf(' '); string numPart = monthStr.Substring(splitPos).Trim(); // 统一把逗号替换为点,兼容两种小数写法 numPart = numPart.Replace(',', '.'); // 用固定文化格式解析,确保点被识别为小数分隔符 return double.Parse(numPart, System.Globalization.CultureInfo.InvariantCulture); } // 测试解析与比较 double numMaj = ExtractNumber(Months[4]); double numJun = ExtractNumber(Months[5]); Console.WriteLine($"Máj对应数值:{numMaj}"); Console.WriteLine($"Jún对应数值:{numJun}"); // 直接用数值运算符比较 if (numMaj > numJun) { Console.WriteLine($"较大值为:{numMaj}"); } else { Console.WriteLine($"较大值为:{numJun}"); } } }
鲁棒性优化(可选)
如果后续数据源可能出现格式异常,可以把double.Parse换成double.TryParse,避免格式错误导致程序崩溃:
double ExtractNumber(string monthStr) { int splitPos = monthStr.IndexOf(' '); string numPart = monthStr.Substring(splitPos).Trim().Replace(',', '.'); // 解析失败时返回默认值0,可根据需求调整 if (double.TryParse( numPart, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out double result)) { return result; } return 0; }
内容的提问来源于stack exchange,提问作者Burr3to
相关产品推荐
相关产品推荐

