gpt4 book ai didi

bash - dc(1) 和前导零

转载 作者:行者123 更新时间:2023-12-04 06:31:40 26 4
gpt4 key购买 nike

我有一个 shell 脚本,我用 dc(1) 做了一些计算。

我需要打印一个带前导零的数字;我找不到一种简单直接的方法来使用 dc 本身来做到这一点,但联机帮助页确实提到:

Z
Pops a value off the stack, calculates the number of digits it has (or number of characters, if it is a string) and pushes that number. The digit count for a number does not include any leading zeros, even if those appear to the right of the radix point.



这意味着有一种简单直接的方法......

我知道有无数种方法可以实现这一点,而且我的脚本正在与其中一个一起愉快地运行。我只是好奇 ;-)

最佳答案

试试这个:

进入:

[lc1+dsc0nld>b]sb
[sddZdscld>bp]sa
999
12lax

输出:
000000999

进入:
3lax

输出:
999

宏结束后,原始数字留在堆栈中。使用的寄存器: a (宏), b (宏), c (计数), d (数字)。

解释:

a进行设置,调用 b并打印原始号码。
  • sd - 将要输出的位数存储在寄存器 d
  • dZ - 复制原始数字并推送其位数
  • dsc - 复制该计数并将其存储在寄存器 c
  • ld>b - 从寄存器 d 加载所需的数字, 如果它大于计数然后调用宏 b
  • p - 打印原始号码

  • b输出零,直到计数大于所需的位数
  • lc1+ - 从寄存器 c 加载计数并增加它
  • dsc - 复制计数并将其存储回寄存器 c
  • 0n - 输出一个没有换行符的零
  • ld>b - 从寄存器 d 加载所需的数字, 如果它仍然大于增加的计数,则循环返回运行宏 b再次,否则将返回给调用者(宏 a )

  • 要使用任意前导字符:
    [lclkZ+dsclknld>b]sb
    [sksddZdscld>bp]sa
    999 14 [ ] lax
    999
    [abc] 12 [-] lax
    ---------abc

    除了其他寄存器之外,它还使用 k存储字符(实际上可能不止一个):
    [XYZ] 6 [def] lax
    defXYZ
    8 [ab] lax
    abababXYZ
    4 [ghjikl] lax
    ghijklXYZ

    填充字符串被完整使用,因此如果所需的长度数大于原始字符串的长度,但小于两个字符串的长度(或整数倍),则结果可能比您要求的要长。

    关于bash - dc(1) 和前导零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5336511/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com