首页 > 解决方案 > 自定义函数 - 对于字符串中的每个字符

问题描述

天,

我正在尝试将一个自定义公式放在一起,它的逻辑非常简单。基本上,对于我传递给它的每个字符串,我希望它删除所有非数字字符并将前导零应用于找到的每个数字(如果数字小于 10)

例如:

function('gi-1/1')应该返回 0101 (或简单地返回 101 作为整数)。'gi-1/3' 将分别返回 0103(或 103)。

我正在努力使用 mcode 实现这一目标,我希望你能帮助我。到目前为止,这是我设法汇总的内容(另外,如果数字< 100,我只想这样做)

let if_order = (if_name) => 
    let
        Result_1 = Text.Select(if_name, {"0".."9"}) as number,
        Result_2 = if Result_1 < 100 then Text.Combine({Text.Start(Result_1, 1), "0", Text.Middle(Result_1,1)}) else Result_1
    in
        Result_2
in
    if_order

我得到的错误非常令人困惑。基本上它是在说:

“我们无法将值“11”转换为数字类型”

希望这是有道理的。

标签: powerbipowerquerym

解决方案


问题是Text.Select返回文本,但您要求它是一个数字。您需要更明确地进行转换。

试试这个修改(将结果输出为文本):

let if_order = (if_name) => 
    let
        Result_1 = Text.Select(if_name, {"0".."9"}),
        Result_2 = if Number.FromText(Result_1) < 100
                   then Text.Combine({Text.Start(Result_1, 1), "0", Text.Middle(Result_1,1)})
                   else Result_1
    in
        Result_2
in
    if_order

如果你想返回一个整数,你可以使用数学而不是字符串操作:

let if_order = (if_name) => 
    let
        Result_1 = Number.FromText(Text.Select(if_name, {"0".."9"})),
        Result_2 = if Result_1 < 100
                   then 100 * Number.IntegerDivide(Result_1, 10)
                            + Number.Mod(Result_1, 10)
                   else Result_1
    in
        Result_2
in
    if_order

推荐阅读