解析所有可能类型的不同架构维度输入到从字符串转换为双精度的函数。下面是我们期望有效的输入类型列表。输入|含义|输出(双精度为英寸)12.5'??|12英尺6英寸|150.011"|11英寸|11.03/16"|十六分之一英寸|0.1875infeetandinchesandinchesandBetweenteensescanbeusedwithorwithoutspaces143.011'11"|11feetandinches|143.011'11"|11英尺11英寸|143.0在英尺和英寸之间或英寸和十六分之一之间或两者都可以使用或不使用破折号12'-11"|12ft和11in|155.0155.187512'113/16"|12英尺11英寸和十六分之三|155.187512'11-1/2"|12英尺11英寸和八分之六|155.5英尺和英寸以及英寸和十六分之一之间的任何空间都可以使用12'111/2"|12英尺11英寸又8分之六|155.5另一种更简单的格式121103|12英尺11英寸又十六分之三|和11英寸又3十六分之二|-155.1875-11'11"|11英尺11英寸|-143.0我们目前正在使用一组非常复杂的分支逻辑来尝试确定输入试图模拟的格式......并且它不起作用所有情况。是否有LINQ、正则表达式和巫术的一些可能组合,我们可以使用它们来确定如何解析字符串?另请注意,我们真的想避免提供一个简单的组合框来选择输入格式类型。此功能适用于您的输入值示例。publicstaticDoubleConv(Stringinp){Stringexpr="((?\d+)(?\d{2})(?\d{2}))|((?[\d.]+)')?[\s-]*((?\d+)?[\s-]*((?\d+)/(?\d+))?")?";Matchm=newRegex(expr).Match(inp);Doublefeet=m.Groups["feet"].Success?Convert.ToDouble(m.Groups["feet"].Value):0;Int32inch=m.Groups["inch"].Success?转换。ToInt32(m.Groups["inch"].Value):0;Int32sixt=m.Groups["sixt"].Success?Convert.ToInt32(m.Groups["sixt"].Value):0;Int32数字=m.Groups["numer"].Success?Convert.ToInt32(m.Groups["numer"].Value):0;Int32denom=m.Groups["denom"].Success?Convert.ToInt32(m.Groups["denom"].Value):1;returnfeet*12+inch+sixt/16.0+numer/Convert.ToDouble(denom);}请注意,除了您提供的有效输入,我没有做任何其他事情输入测试.你可能想检查是否成功,例如至少在一些捕获组中,或者你可以将验证作为一个单独的步骤进行。此代码是在解析时生成的。编辑:这是一个更强大的版本:publicstaticDoubleConv(Stringinp){Stringexpr="^\s*(?-)?\s*(((?\d+)(?\d{2})(?\d{2}))|((?[\d.]+)')?[\s-]*((?\d+)?[\s-]*((?\d+)/(?\d+))?")?)\s*$";Matchm=newRegex(expr).Match(inp);if(!m.Success||inp.Trim()==""){//也许抛出异常或设置/返回一些失败指示符return0;//这里使用返回值零作为失败指示符}Int32sign=m.Groups["minus"].Success?-1:1;Doublefeet=m.Groups["英尺”]。成功?Convert.ToDouble(m.Groups[“英尺”]。价值):0;Int32英寸=m.Groups[“英寸”]。成功?Convert.ToInt32(m.Groups[“英寸”].Value):0;Int32sixt=m.Groups["sixt"].Success?Convert.ToInt32(m.Groups["sixt"].Value):0;Int32numer=m.Groups["numer"].成功?Convert.ToInt32(m.Groups["numer"].Value):0;Int32denom=m.Groups["denom"].Success?Convert.ToInt32(m.Groups["denom"].Value):1;returnsign*(feet*12+inch+sixt/16.0+numer/Convert.ToDouble(denom));}对于空字符串,以及包含超出示例允许的额外字符的字符串,它将失败。五位或更多数字被认为是更简单的格式。更改是开始和结束锚点,允许前导和尾随空格,以及if语句中对emtpy/whitespace-only字符串的特殊情况检查。免责声明:这显然不会测试所有可能的非法输入,反正我不是c#程序员?这可能会将您的复杂性从分支逻辑转移到正则表达式逻辑:/(?(?d+)(?d{2})(?d{2}))|((?[d.]+)')?[s-]*((?d+)?[s-]*((?d+)/(?d+))?")?/如果组特殊匹配,则您有特殊语法,输出为feet*12+inches+_sixt_/16,在组上使用ToDecimal。如果没有,您将有一个或多个组foot、inch、numer和denom。其余部分使用ToDouble,其余部分使用ToDecimal,并确保检查分数是否被零除.概念验证代码(ruby):[["12.5'??","12英尺六英寸","150.0"],["11"","11英寸","11.0"],["3/16"","十六分之三英寸","0.1875"],["11'11"","11英尺11英寸","143.0"],["11'11"","11英尺11英寸","143.0"],["12'-11"","12英尺11英寸","155.0"],["12'113/16"","12英尺11英寸又16分之3",,"155.1875"],["12'11-1/2"","12英尺11英寸又8十六分之一","155.5"],["12'111/2"","12英尺又11英寸和8个十六分之二","155.5"],["121103","12英尺和11英寸和3个十六分之三","155.1875"],["","空字符串","0"],].each{|我,d,o|m=/(?(?d+)(?d{2})(?d{2}))|((?[d.]+)')?[s-]*((?d+)?[s-]*((?d+)/(?d+))?")?/.match(i)#puts"#{(1..8).map{|n|"%15s"%m[n].inspect}.join}"放"#{"%20s"%i}#{"%10s"%o}#{m[:special]?m[:feet].to_i*12+m[:inch].to_i+m[:sixt].to_i/16.0:m[:feet].to_f*12+m[:inch].to_i+(m[:numer].to_i.to_f/(m[:denom]||1).to_i)}"}输入:12.5'??150.0150.011"11.011.03/16"0.18750.187511'11"143.0143.011'11"143.0143.012'-11"155.0155.012'113/16"155.1875.11815-15.15'15.12'12"155.5155.512"155.5155.512"155.5155.512'111/2"155.5155.5121103155.1875155.187500.0请注意,除了您提供的有效输入之外,我没有进行任何输入测试您可能想要检查例如至少在一些捕获组中非零值,或者你可以把Validationhappensasaseparatestep.这段代码是在解析的时候做的。以上是C#学习教程:分析不同建筑维度的所有可能类型以全部内容输入分享,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注,本文收集自网络,不代表立场。如有涉及侵权,请点击维权联系管理员删除,如需转载请注明出处:
