如何将带前导零的数字填充到固定长度?

时间:2015-08-20 19:45:04

标签: windows batch-file

我已经尝试过这样在早上的大部分时间。

这实际上与2013年的这个问题相同,没有人回复:

batch script with FOR does not work

我会尽力格式化代码,以便易于理解,也许我会得到答案......

我正在通过我们的服务台票务系统进行存档项目。 出于分类目的,文件将包含票号和日期​​。

但是,票号的长度不一。要解决此问题,所有票号都是6位数,较短的数字用前面的零填充(即1234变为001234)。

我可以获得票号,但我需要找到它的长度才能知道要添加多少个零。

这有效:

echo off
set my_str=12345 
set length=0

:Loop
  if defined my_str (
  set my_str=%my_str:~1%
  set /A "length+=1"
  goto Loop)

echo the string is %length% characters long

但是,我在列表中得到了一堆票号。 所以,我读完了这个:

set statements don't appear to work in my batch file

迷失了读这个:

http://www.computing.net/howtos/show/batch-script-variable-expansion-win200-and-up/248.html

我试过这个:

setlocal enabledelayedexpansion
echo off

for /f %%a IN (test.txt) do (
   set my_str=%%a
   set length=0

:Loop
if defined my_str (
    set my_str=!my_str:~1!
    set /A "length+=1"
    echo %length%
  goto Loop)

echo the string is %length% characters long
)

但它只读取test.txt的第一行

为什么FOR / F循环失败?

如何让它发挥作用?

3 个答案:

答案 0 :(得分:4)

  1. 您不需要知道票号字符串的长度(当您可以确保它不超过6个字符时),您可以前缀5个零并分割最后6个字符,然后:< / p>

    set my_str=12345
    
    set my_str=00000%my_str%
    set my_str=%my_str:~-6%
    
    echo %my_str%
    

    如果您仍想获得字符串长度,请参阅this post

  2. 您无法在goto正文中使用forgoto会打破for循环上下文。但是,您可call for内的子例程,而{ - 1}}可能包含goto

答案 1 :(得分:0)

您的批处理脚本完全符合您的描述:读取多个文件的第一行(在您的情况下,只有一个文件)并确定第一行的长度。即你的for循环的内部部分错了。

我也不知道正确的解决方案,但我认为此页面对您有所帮助:

http://ss64.com/nt/for_f.html

我希望有所帮助。

答案 2 :(得分:0)

这似乎是XY problem。不要担心计算字符串的长度,只需使用内置的子字符串方法来创建填充字符串。

@echo off
setlocal enabledelayedexpansion
for /f %%a IN (test.txt) do (
   set my_str=000000%%a
   @echo !my_str:~-6!
)

最终结果echo'ed将是一个用零填充的六位数字。