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

2023-12-19

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

Input|意义|Output(英寸以双精度表示)


12.5'| 12 英尺 6 英寸 |150.0

11"| 11 英寸 |11.0

3/16"| 3 十六分之一英寸 |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 英寸又十六分之三 |155.1875

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


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

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


还可以使用替代的更简单的格式

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


每种格式都可能出现负片

-121103| 12 英尺 11 英寸又十六分之三 |-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);
}    

请注意,除了您提供的有效输入之外,我没有做出任何努力来测试其他输入。您可能想要例如检查至少某些捕获组是否成功,或者可以将验证作为单独的步骤进行。这段代码是在考虑解析的情况下编写的。

Edit:

这是一个更强大的版本:

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));
}

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

更改是开始和结束锚点以及允许的前导和尾随空白,以及 if 语句中对空/仅空白字符串的特殊情况检查。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析不同架构维度输入的所有可能类型 的相关文章

随机推荐

  • 有没有办法让StringIO读取阻塞

    我已经搜索了文档并四处搜索 但没有提到阻止 StringIO 对象 我可以创建我自己的类似文件的对象 它只是简单地包装 StringIO 但是使它阻塞的最佳方法是什么 我知道的唯一方法是使用 while 循环和 time sleep 0 1
  • 如何使用c程序查找我的机器是16位、32位还是64位

    有人可以给出简单的c程序来确定我的机器是16位 32位还是64位吗 如果您只关心 Linux 操作系统 那么您可以使用 uname 调用 您可以将 struct utsname 传递给此 API 并获取详细信息 您可以通过以下网址获取更多详
  • PHP foreach循环每2个项目包装一次

    div class puffar div
  • OpenCV无法绘制关键点

    我尝试运行所示的示例代码ORB in the openCV页 首先我必须弄清楚问题cv2 ORB 变成cv2 ORB create 出现此错误后 出现以下内容 Traceback most recent call last File orb
  • 将自定义信息添加到 HockeyApp 崩溃报告中

    我将我的 iOS 应用程序与 HockeyApp 平台集成 一切正常 但我需要添加一些额外的信息 例如来自 NSLog 的文本 以崩溃报告 有可能的 我不想使用外部框架 NSLogger CocoaLumberjack 数据库 服务器 We
  • js动态访问私有字段(属性/成员)

    我正在尝试新的类私有成员特征 https developer mozilla org en US docs Web JavaScript Reference Classes Class fields Private fields 然而 我很
  • EF4 可以为我生成 POCO,还是我必须自己编写它们?

    我最近一直在研究 Entity 4 框架 它非常漂亮 我已经设置了一个名为 Customer cs 的类 其中包含一些属性 例如名称 地址等 我还有一个名为 StoreEntities cs 的类 它通过 DbSet 将这些属性绑定回数据库
  • Python排序——对象列表

    如果可能的话 我想使用 somelist sort 方法来执行此操作 我有一个包含对象的列表 所有对象都有一个成员变量 resultType 它是一个整数 我想使用这个数字对列表进行排序 我该怎么做呢 Thanks somelist sor
  • 使用 MVVM 选择 ListView 中的所有项目

    我正在尝试选择所有Items in a ListView 使用 mvvm 使用代码隐藏 我尝试过全选 and foreach选择它们 但我想像项目的其余部分一样使用 MVVM 有任何想法吗 这是列表视图
  • 解析 request.object.existed() 返回 false

    我的解析有问题 我写了云代码 Parse Cloud afterSave Parse User function request var user request object if user existed all the times u
  • “git推送”和“git流放推送”有什么区别?

    我有一个 git 存储库 并且系统指示我执行以下操作序列 将给定的一组文件从文件夹复制到上述 git 存储库 源文件夹 不是存储库的一部分 Execute git add Execute git exile push folder name
  • 如何在反应日期中添加一年的选择?

    向右滑动几个月直到我到达正确的年份是很痛苦的react dates 是否有可能添加一些年份 月份的选择 是的 从版本开始是可能的 电子邮件受保护 cdn cgi l email protection 相关拉取请求 https github
  • gcc include 顺序损坏?

    我遇到了一个奇怪的问题 linux c 编译器包含本地目录而不是系统目录中的文件 使用 H 选项查看预编译器输出 可以看到系统文件 usr include sched h突然包括time h来自本地目录而不是系统一的标头 我假设如果包含文件
  • powershell 无法向 Excel 图表添加多个图例条目(系列)

    我在通过 powershell 将多个系列添加到 Excel 图表对象中的系列集合时遇到问题 这是我的代码 threading thread CurrentThread CurrentCulture en US excel New Obje
  • 带有 BroadcastReceiver 的清单中的 ACTION_USER_PRESENT

    对于是否可以通过清单捕获 ACTION USER PRESENT 屏幕解锁似乎存在不同意见 该线程暗示不 它不能完成 Android 广播接收器不工作 https stackoverflow com questions 6698716 an
  • 使用 Scala 中的原始类型实现 Java 接口

    我正在尝试使用 Scala 构建 Sonar 的扩展 我需要扩展以下 Java 接口 public interface Decorator extends BatchExtension CheckProject void decorate
  • 使用 NSKeyedUnarchiver 解码时出现问题

    我正在 XCode 3 2 3 上编写一个针对 iOS 4 0 的应用程序 当应用程序关闭时 我使用 NSCoder 协议存储一些数据 保存似乎工作正常 问题是从保存的文件中检索数据 我的保存方法如下所示 void saveMusicalW
  • 如何将 TrueType 字体转换为 PCL5 Soft 字体?

    如何将 TrueType 字体转换为 PCL5 softfont spf 主要思想是将软字体嵌入到 PCL5 打印文件中 然后选择它供打印机使用 因为它是通过 PCL5 命令指定的字体 ID 另外 如果您知道在创建 PCL5 文件时使用 T
  • 在 C++11 中使用没有托管共享指针的shared_from_this()

    假设我有一个类 它是enable shared from this 的子类 这个基类的文档说在调用shared from this之前应该有一个拥有这个类的共享指针 用new分配类并调用shared from this来管理对象是否安全 正
  • 解析不同架构维度输入的所有可能类型

    我正在为我们公司的产品编写一个库 它将采用我们的用户已经熟悉的任何类型的架构维度作为从字符串转换为双精度的函数的输入 这是我们希望有效的输入类型列表 Input 意义 Output 英寸以双精度表示 12 5 12 英尺 6 英寸 150