You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FileMaker中提取去除前6字符后首字母前的数字?

FileMaker 提取序列号指定数字部分的正确写法

需求

处理Serial Number字段,完成以下三步:

  • 移除字段值的前6个字符
  • 提取第一个大写字母(A-Z)出现之前的所有数字部分
  • 将提取内容转换为数字类型
    示例:
  • 输入15266R16S12P2 → 输出16
  • 输入12345P382M45 → 输出382

你之前代码的问题

  1. Position函数不支持正则表达式(如[A-Z])作为匹配条件,无法批量查找字母
  2. 枚举单个字母的方式覆盖不全,且无字母的边缘场景处理逻辑有误

正确实现

方案1:原生函数组合(兼容所有FileMaker版本)

无需循环,通过Filter和Position组合实现:

Let ( [
    stripped = Right ( Serial Number ; Length ( Serial Number ) - 6 ) ;
    all_letters = Filter ( stripped ; "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ) ;
    first_letter_pos = If ( not IsEmpty ( all_letters ) ; Position ( stripped ; Left ( all_letters ; 1 ) ; 1 ; 1 ) ; Length ( stripped ) + 1 ) ;
    num_part = Left ( stripped ; first_letter_pos - 1 )
] ;
    GetAsNumber ( num_part )
)

方案2:While循环(FileMaker 16及以上版本,逻辑更直观)

通过循环逐个检查字符,定位第一个字母的位置:

Let ( [
    stripped = Right ( Serial Number ; Length ( Serial Number ) - 6 ) ;
    total_len = Length ( stripped ) ;
    pos = 1 ;
    found_letter = False
] ;
    While (
        pos ≤ total_len and not found_letter ;
        [
            curr_char = Middle ( stripped ; pos ; 1 ) ;
            found_letter = PatternCount ( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; curr_char ) > 0 ;
            pos = pos + 1
        ] ;
        GetAsNumber ( Left ( stripped ; pos - ( If ( found_letter ; 2 ; 1 ) ) ) )
    )
)

方案说明

  • 方案1通过Filter一次性提取所有大写字母,避免枚举遗漏;用IsEmpty判断是否存在字母,完美处理无字母的边缘场景
  • 方案2循环逻辑清晰,代码紧凑,适合复杂字符匹配需求
  • 最终通过GetAsNumber转换数字类型,自动忽略前导/后导空格,容错性强

内容的提问来源于stack exchange,提问作者Ken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:25:57