gpt4 book ai didi

c# - 解析所有可能类型的不同架构维度输入

转载 作者:太空狗 更新时间:2023-10-29 17:56:13 26 4
gpt4 key购买 nike

我正在为我们公司的产品编写一个库,它将采用我们的用户已经熟悉的任何类型的架构维度作为将字符串转换为 double 的函数的输入。以下是我们希望有效的输入类型列表。

输入|含义 | 输出(以 double 表示的英寸)


12.5'​​ | 12 英尺 6 英寸 | 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' 11 3/16" | 12 英尺 11 英寸又 3 十六分之一 | 155.1875

12' 11-1/2" | 12 英尺 11 英寸又 8 十六分之一 | 155.5


英尺和英寸之间以及英寸和十六分之一之间可以使用任意数量的空格

12' 11 1/2" | 12 英尺 11 英寸又 8 十六分之一 | 155.5


另一种更简单的格式也可用

121103 | 12 英尺 11 英寸又 3 十六分之二 | 155.1875


底片也可以以各种格式出现

-121103 | 12 英尺 11 英寸又 3 十六分之二 | -155.1875

-11'11" | 11 英尺 11 英寸 | -143.0

我们目前正在使用一组极其复杂的分支逻辑来尝试确定输入试图模拟的格式......但它并非在所有情况下都有效。

是否有某种可能的 LINQ 和正则表达式组合以及我们可以用来确定如何解析字符串的巫术?

另请注意,我们确实希望避免在表单上提供一个简单的组合框来从中选择输入格式类型。

最佳答案

此函数适用于您的输入值示例。

public static Double Conv(String inp)
{
String expr= "((?<feet>\\d+)(?<inch>\\d{2})(?<sixt>\\d{2}))|((?<feet>[\\d.]+)')?[\\s-]*((?<inch>\\d+)?[\\s-]*((?<numer>\\d+)/(?<denom>\\d+))?\")?";
Match m = new Regex(expr).Match(inp);
Double feet = m.Groups["feet"].Success ? Convert.ToDouble(m.Groups["feet"].Value) : 0;
Int32 inch = m.Groups["inch"].Success ? Convert.ToInt32(m.Groups["inch"].Value) : 0;
Int32 sixt = m.Groups["sixt"].Success ? Convert.ToInt32(m.Groups["sixt"].Value) : 0;
Int32 numer = m.Groups["numer"].Success ? Convert.ToInt32(m.Groups["numer"].Value) : 0;
Int32 denom = m.Groups["denom"].Success ? Convert.ToInt32(m.Groups["denom"].Value) : 1;
return feet*12+inch+sixt/16.0+numer/Convert.ToDouble(denom);
}

请注意,除了您提供的有效输入之外,我没有对其他输入进行任何测试。你可能想要,例如至少在一些捕获组中检查是否成功,或者可能将验证作为一个单独的步骤进行。编写此代码时考虑到了解析。

编辑:

这是一个更健壮的版本:

public static Double Conv(String inp)
{
String expr= "^\\s*(?<minus>-)?\\s*(((?<feet>\\d+)(?<inch>\\d{2})(?<sixt>\\d{2}))|((?<feet>[\\d.]+)')?[\\s-]*((?<inch>\\d+)?[\\s-]*((?<numer>\\d+)/(?<denom>\\d+))?\")?)\\s*$";
Match m = new Regex(expr).Match(inp);
if(!m.Success || inp.Trim()=="")
{
// maybe throw exception or set/return some failure indicator
return 0; // here using return value zero as failure indicator
}
Int32 sign = m.Groups["minus"].Success ? -1 : 1;
Double feet = m.Groups["feet"].Success ? Convert.ToDouble(m.Groups["feet"].Value) : 0;
Int32 inch = m.Groups["inch"].Success ? Convert.ToInt32(m.Groups["inch"].Value) : 0;
Int32 sixt = m.Groups["sixt"].Success ? Convert.ToInt32(m.Groups["sixt"].Value) : 0;
Int32 numer = m.Groups["numer"].Success ? Convert.ToInt32(m.Groups["numer"].Value) : 0;
Int32 denom = m.Groups["denom"].Success ? Convert.ToInt32(m.Groups["denom"].Value) : 1;
return sign*(feet*12+inch+sixt/16.0+numer/Convert.ToDouble(denom));
}

对于空字符串和包含您的示例所允许之外的额外字符的字符串,它会失败。五位或更多数字被视为更简单的格式。

更改是开始和结束 anchor 以及允许的前导和尾随空格,以及 if 语句中对 emtpy/whitespace-only 字符串的特殊情况检查。

免责声明:这显然没有针对所有可能的非法输入进行测试,而且我也不是 c# 程序员:-)

关于c# - 解析所有可能类型的不同架构维度输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22794466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com