【问题标题】:How to format strings and hexadecimals in Scriban如何在 Scriban 中格式化字符串和十六进制
【发布时间】:2023-01-18 00:37:03
【问题描述】:

我正在编写基于某些配置生成 C++ 文件的 C# 解决方案。为此,我使用 Scriban 作为模板引擎。之前在Jinja2看到过如下语句:

uint16_t {{"%25s"|format(device.name)}} = {{"0x%08x"|format(device.address)}};

device.name 是一个字符串,device.address 包含十六进制值 (0x50060800)。

我试过这个:

uint16_t {{device.name | object.format "%25s"}} = {{device.address | math.format "0x%08x"}};

我收到以下错误:

<input>(15,50) : error : Unexpected `RNG`. Must be a formattable object
<input>(15,71) : error : Unexpected `0x50060800`. Must be a formattable object

这是我期待的结果:

uint16_t RNG = 0x50060800;

我怎样才能在 Scriban 中实现上述声明?

【问题讨论】:

  • 您能否在提供变量的模板周围添加 C# 代码?现在看起来您不需要格式化任何东西,因为值 RNG0x50060800 已经是预期的形式(尤其是字符串 RNG,格式字符串 %25s 的目标是什么?)

标签: c# templates scriban


【解决方案1】:

我回答了in your GitHub issue。我会贴在这里供后代使用

记住:

  • Jinja 是为 Python 编写的。因此,它使用 Python 约定来处理格式字符串等内容。
  • Scriban 是用 C# 编写的 - 它对格式字符串使用 C# 约定。

基于this StackOverflow post,似乎通过使用"%25s",你试图将device.name的宽度填充到25个字符。这样做的方法抄写员正在使用string.pad_right(或string.pad_left)函数。

此外,您的十六进制格式字符串不正确(数字格式字符串的 X 说明符上的 see the C# documentation

把所有这些放在一起:

uint16_t {{device.name | string.pad_right 25 }} = 0x{{device.address | math.format "X8"}};

但是请注意,数字格式字符串仅适用于数字类型。因此,如果 device.address 属性是十进制表示的 string(即 "1342572544"),您首先必须将其转换为数字,如下所示:

0x{{device.address | string.to_int | math.format "X8"}};

如果 device.address 属性是 string十六进制表示,它变得有点诡计。我没有看到为您转换它的内置函数。所以,你必须自己制作。 See an example here

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2021-09-18
    • 2022-07-08
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多