StringScoreDoubling我需要一个函数来将用户输入的数字解析成double。我不能在客户端做任何事情,也不能改变输入的完成方式。输入|期望的输出“9”|9"93/4"|9.75英寸91/2英寸|9.5"9.25"|9.25"9,0001/3"|9000.33"1/4"|.25我看到我已经看过这篇文章,但它是用Python编写的,我只是想知道在我花时间编写自己的文章之前是否有人知道任何奇特的C#方法来完成它。我会使用正则表达式:Regexre=newRegex(@"^s*(d+)(s*.(d*)|s+(d+)s*/s*(d+))?s*$");字符串str="91/2";匹配m=re.Match(str);双val=m.Groups[1].成功?double.Parse(m.Groups[1].Value):0.0;if(m.Groups[3].Success){val+=double.Parse("0."+m.Groups[3].Value);}else{val+=double.Parse(m.Groups[4].Value)/double.Parse(m.Groups[5].Value);尚未经过测试,但我认为它应该可以工作。这是一个演示,这是另一个演示。BCL中没有任何东西可以执行此操作,但是有大量现有的数学表达式解析器(尽管在这种特定情况下可能超出了顶部)。自己写一个,对于您发布的有限用例来说应该不难。我看到两个部分。第一个空格之前的所有内容都是不可分割的一部分。第一个空格之后的所有内容都是小数部分。将两部分分开后,可以去掉小数部分的空格,将部分拆分在/字符上,将第一部分除以第二部分(如果有第二部分)。然后将结果与积分部分相加,求出答案。该算法应该为每个样本给出正确的结果。对于像这样的样本,它也可能给出错误的结果:“9.25/4”或“93/0”,所以这些都是需要注意的事情。其他内容包括前导空格、是否允许额外的空格、货币符号、“9.25”(无空格)是否是有效输入,以及如何处理“1/3”、“1/10”(二进制无理数)等无理分数)等。对于静态类型的语言,我通常不太相信测试驱动设计(你应该先编写测试并有100%的覆盖率),但我认为单元测试在某些特定情况下是有价值的,这就是一个那些情况。我会针对一些常见和边缘情况进行一些测试,因此您可以确保最终处理正确的输入以通过测试。这是我最后使用的内容:privatedoubleParseDoubleFromString(stringnum){//删除字符、cammas和前导/尾随空格之间的多个spcesnum=Regex.Replace(num.Replace(",",""),@"s+","").Trim();双d=0;整数=0;双分子;双分母;//有小数吗?if(num.Contains("/")){//是否有空格?if(num.Contains("")){//分隔整数和小数intfirstspace=num.IndexOf("");字符串分数=num.Substring(firstspace,num.Length-firstspace);//设置整数whole=int.Parse(num.Substring(0,firstspace));//设置分子和分母numerator=double.Parse(fraction.Split("/".ToCharArray())[0]);分母=double.Parse(fraction.Split("/".ToCharArray())[1]);}else{//设置分子和分母numerator=double.Parse(num.Split("/".ToCharArray())[0]);分母=double.Parse(num.Split("/".ToCharArray())[1]);}//它是一个有效的分数吗?如果(分母!=0){d=整数+(分子/分母);}}else{//解析整个东西d=double.Parse(num.Replace("",""));}返回d;}写一些做这个操作的代码看起来并不难。首先尝试删除所有空格,看看它是否是合法数字。如果不是,找到合法的数字(例如“93/4”中的9,3,4并做简单的算术:9+3/4=9.75我为这个工作写了这个方法:privatedoubleDoWork(stringdata){doublefinal=0;foreach(stringsindata.Split('')){if(s.Contains('/')){final+=double.Parse(s.Split('/')[0])/double.Parse(s.Split('/')[1]);}else{doubletryparse=0;double.TryParse(s,outtryparse);final+=tryparse;}}returnfinal;}它对你有用吗?我认为您还可以使用动态编译代码staticvoidMain(string[]args){varvalue="93/4";value=value.Split('')[0]+"d+"+value。Split('')[1]+"d";varexp="publicclassDynamicComputer{publicstaticdoubleEval(){return"+value+";}}";CodeDomProvidercp=newMicrosoft.CSharp.CSharpCodeProvider();ICodeCompilericc=cp.CreateCompiler();CompilerParameterscps=newCompilerParameters();CompilerResultscres;cps.GenerateInMemory=true;cres=icc.CompileAssemblyFromSource(cps,exp);;Typet=asm.GetType("DynamicComputer");双d=(double)t.InvokeMember("Eval",BindingFlags.InvokeMethod,null,null,null);控制台.WriteLine(d);控制台.Read();}下面的解决方案对负分数不起作用,可以通过将上面的改成C#学习教程:StringFractionDoubling分享的所有内容,如果对你有用,需要了解更多C#学习教程,我希望大家多加注意——//它是一个有效的分数吗?if(denominator!=0){d=whole+(numerator/denominator);}到//它是一个有效的分数吗?if(denominator!=.0){varsign=Math.Sign(whole);d=整数+符号*(分子/分母);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
