我期望的行为是:
从序列号中删除前6个字符。
在第一次出现字母(A-Z)之前提取数字部分。我尝试使用带有位置的Let函数和最小的函数来找到第一个字母并提取数字,但是我遇到了计算无法正常工作的问题。 我认为最初会起作用的地方(
Middle ( Serial Number; 7; Position ( Serial Number; "[A-Z]" ; 7 ; 1 )- 7)
GetAsNumber (
Let (
[
stripped = Right( Serial Number ; Length( Serial Number ) - 6 ) ;
firstLetterPos = Min(
Position( stripped ; "A" ; 1 ; 1 ) ;
Position( stripped ; "B" ; 1 ; 1 ) ;
Position( stripped ; "C" ; 1 ; 1 ) ;
...
) ;
firstLetterPos = If( firstLetterPos = 0 ; Length( stripped ) + 1 ; firstLetterPos ) ;
numericPart = Left( stripped ; firstLetterPos - 1 )
] ;
GetAsNumber( numericPart )
)
)
问题:
仅当第二个字母是特定字母(例如a)并且无法正确处理其他字母或边缘案例的情况下,该计算才起作用。
我正在寻找什么:
我想在删除前6个字符后在第一个字母(A-Z)之前提取数字部分,然后将该部分转换为数字。有人可以帮助我纠正此计算或提出更好的方法吗?
Let ([
// test input. Put your real input here:
~serial = "12345P382M45" ;
~stripped = Right ( ~serial ; Length ( ~serial ) - 6 ) ;
~letter = Left ( Filter ( ~stripped ; "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" ) ; 1 ) ;
~pos = Position ( ~stripped ; ~letter ; 1 ; 1 ) ;
// I'm not sure what you want to happen if there are no letters
// but this will return EVERYTHING after the first 6 digits in
// the absense of letters(~pos == 0)
~res = If (
~pos > 0 ;
Left ( ~stripped ; ~pos - 1 ) ;
~stripped
)
];
GetAsNumber ( ~res )
)