Text.Format

官方说明:

返回通过将来自列表或记录的arguments应用于格式字符串formatString创建的格式化文本。可以视情况指定区域性。
Text.Format( formatString as text, arguments as any, optional culture as nullable text) as text

解读:

以前在需要构建长文本的时候,尤其是构建动态url这种,我都是直接用&将文本连接,比如:
url = (a,b,c)=>"http://xxxxxxx?_sport_t_="& a &"&_sport_s_="& b &"&app_key="& Text.From(c)
为了举这个例子,我不断把我写的输入到编辑栏看报不报错,因为我需要非常小心引号和&的位置及个数,以及数据类型的转换。
基本上每次构建这种长文本我都要调试很长时间,这让我感到绝望,直到有一天我遇见了Text.Format

____今天天气____,最高温度____度,最低气温____度。
A.北京 B.晴 C.38 D.24

这样的填空题大家都不会陌生,当文本有多处这样的空需要填写的时候,就可以使用Text.Format来处理:
= Text.Format("#{0}今天天气#{1},最高温度#{2}度,最低气温#{3}度。",{"北京","晴","38",24})

我们可以发现第一参数中的文本只用了一对引号,且没有使用&,整体看起来非常自然。第二参数中的38和24,一个为text一个为number,但最终的结果都对了,说明该函数自带Text.From的效果。

此时第一参数为需要格式化的文本字符串,在空白处使用#{0}的方式进行填充,第二参数为list,作为第一参数的取值范围。
填充时,根据第一参数中的索引进行取值,比如#{0}就取第一个,#{2}就取第三个。

第二参数除了为list的形式,它也可以是一个record,比如:
= Text.Format("#[谁]在人民广场#[干啥咧]",[谁="我",干啥咧="吃炸鸡"])

原理同list,都是从第二参数中取值,填充到第一参数的文本中。使用record比list要多写个字段名,但是对于复杂的文本构造会逻辑更加清晰,可读性更高。

我们除了手动构建第二参数的list或record外,还可以使用已有的,比如:
= Table.AddColumn(源,"合",each Text.Format("#[成绩1]-#[成绩2]-#[成绩3]-#[成绩4]-#[成绩5]",_))

这样即使原来是number,也能够方便的合并文本而不用一个个再去转换数据类型。

第三参数为culture区域选项,主要用于时间的默认格式上,一般用不到可省略,具体可参考《Date(Time).FromText/ToText》

4 Replies to “Text.Format”

  1. 请问,第三参数是当我们来合并出一串时间的时候来确定输出格式的对吧,这时它的书写格式也是"zh-cn"这种吗:p,还是说是"yyyy年M月d日tth时m分s秒"这样的...

  2. `let
    result1 = (str as text,re as text, value as text)=>
    Web.Page(Text.Format(
    "
    //var x= new RegExp(#[re],'g');
    var b=#[str].replace(#[re],#[value]);
    document.write(b);
    ",
    [str=str,re=re,value=value])),
    result=result1("hello123中国456", "/\d+/g",""),
    Data = result{0}[Data],
    Children = Data{0}[Children],
    Children1 = Children{0}[Children]
    in
    Children1
    `
    求大神帮指教,这个用javascript的replace函数,为什么不能生成正确的结果

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注