【问题标题】:Custom function - for each character within a string自定义函数 - 对于字符串中的每个字符
【发布时间】:2021-09-13 15:48:52
【问题描述】:

生日,

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

例如:

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

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

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”转换为数字类型”

希望这是有道理的。

【问题讨论】:

    标签: powerbi powerquery m


    【解决方案1】:

    问题是 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
    

    【讨论】:

    • 如果你不介意我在这里问 - 有没有一种简单的方法来使用类似的功能,但要添加一个自定义字符。例如function("test-123") 返回 tAeAsAtA-1A2A3A?希望这是有道理的,基本上是“foreach c in $string -> $c1A”。希望这是有道理的
    • = Text.Combine(List.Transform(Text.ToList(SourceText), each _ & "A"))
    • 谢谢!!我应该早点多注意你的回答!
    【解决方案2】:

    试试这个

    删除所有非数字 拆分成一个列表,附加一个零,重新组合

    (TheText as text) =>
    let Source = Text.Remove(TheText, { Character.FromNumber(32)..Character.FromNumber(47), Character.FromNumber(58)..Character.FromNumber(255) } ),
    done = Text.Combine(List.Transform(Text.ToList(Source ), each "0"&_))
    in done
    

    【讨论】:

    • List.Transform 是一个简洁的函数(在处理文本时经常有用)。 Text.Remove 只是为了展示与Text.Select 不同的东西吗?
    • 没有。这只是我想到的第一件事,过滤掉非数字而不是主动选择数字。我到达时问题是空白的,没有看到您发布了答案
    • OP 使用Text.Select,所以我想你已经看到了那部分。 :)
    • 不幸的是,我是出了名的不善于观察
    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 2021-03-12
    • 2011-09-21
    • 2020-07-16
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多