【问题标题】:How to split a number into individual digits in CMD/Batch如何在 CMD/Batch 中将数字拆分为单个数字
【发布时间】:2017-08-18 12:37:46
【问题描述】:

我想在 Windows 上使用 cmd/batch 将数字拆分为单独的数字并将它们存储到变量中。例如,数字“38”应在 VAR1 中存储为“3”,在 VAR2 中存储为“8”。

这是我目前对这个问题的看法:

@echo off
SET NUMBER=38
FOR /F "TOKENS=1,2 delims=0123456789" %%A IN ("%NUMBER%") DO (CALL :VARSET %%A %%B)
ECHO %NUMBER% has the fallowing digits:
ECHO 1st digit: %VAR1%
ECHO 2nd digit: %VAR2%
PAUSE
EXIT /B 0

:VARSET
set VAR1=%1
set VAR2=%2
GOTO:EOF

我希望输出是:

ECHO 38 has the fallowing digits:
ECHO 1st digit: 3
ECHO 2nd digit: 8

但我明白了:

ECHO 38 has the fallowing digits:
ECHO 1st digit: Echo is off.
ECHO 2nd digit: Echo is off.

问题似乎在于我使用“0123456789”作为分隔符。也许使用 FOR-LOOP 根本不可行?

编辑:错别字

【问题讨论】:

  • 您可能会发现 SS64's page on substrings 感兴趣。
  • 你似乎理解错了for /Ffor /F 将字符串拆分为由分隔符分隔的标记,因此它们被删除;例如:for /F "tokens=1,2 delims=_" %I in ("_abc__def__gh") do @echo/%I,%J 将返回 abc,def;在您的情况下,输入字符串仅包含分隔符(所有十进制数字,delims=0123456789),因此没有什么可提取的......

标签: windows batch-file for-loop cmd delimiter


【解决方案1】:

用简单的数学来做 - 我建议你从最低有效数字开始,以便能够轻松地重建值。

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
:Again
set "#=" & Set Place=0
Set /p "#=Enter # :"
if "%#%" equ "" goto :Eof
Set /A Test=#
:Loop
Set /A "Place+=1,#[!Place!]=Test %% 10,Test/=10"
If "%Test%" gtr "0" goto :Loop
Set #
Echo =====
For /f "delims==" %%A in ('Set #') Do set "%%A="
Goto :Again

示例运行:

Enter # :123456789
#=123456789
#[0]=9
#[1]=8
#[2]=7
#[3]=6
#[4]=5
#[5]=4
#[6]=3
#[7]=2
#[8]=1
=====
Enter # :

【讨论】:

    【解决方案2】:

    更简单、更快捷。只需在for /L 命令中输入最大位数即可:

    @echo off
    setlocal EnableDelayedExpansion
    
    set NUMBER=%1
    echo %NUMBER% has the following digits:
    
    for /L %%i in (1,1,12) do if defined NUMBER (
       set "VAR[%%i]=!NUMBER:~0,1!"
       set "NUMBER=!NUMBER:~1!"
    )
    
    set VAR[
    

    【讨论】:

      【解决方案3】:

      只是为了它的地狱:

      @Echo Off
      SetLocal EnableDelayedExpansion
      Set "i=0"
      For /F Delims^=^ EOL^= %%A In ('"CMD/U/CEcho %*|Find /V """') Do (Set/A i+=1
          Set "Var[!i!]=%%A")
      Set Var[
      Timeout -1
      

      只需将其作为file.cmd 5678 运行,其中file.cmd 是此脚本的保存名称,5678 是一个字母数字字符串,用于拆分为各个变量。

      【讨论】:

        【解决方案4】:

        编辑:在我发布之前没有看到 LotPings 的答案。谢谢你的回答,同样有效。

        @Jeff Zeitlin 用于链接,aschipfl 用于“课程”:) 一个非常简单的解决方案是:

        @echo off
        SET NUMBER=38
        SET VAR1=%NUMBER:~0,1%
        SET VAR2=%NUMBER:~1,2%
        ECHO %NUMBER% has the following digits:
        ECHO 1st digit: %VAR1%
        ECHO 2nd digit: %VAR2%
        PAUSE
        EXIT /B 0
        

        也许更可重用的方法是:

        @ECHO OFF
        SET COUNT=0
        SET NUMBER=1234567890
        CALL :SPLITNUM %NUMBER%
        PAUSE
        EXIT /b 0
        
        :SPLITNUM
        SETLOCAL ENABLEDELAYEDEXPANSION
        SET NUMBER=%1
        :LOOP
        SET /A COUNT+=1
        SET VAR%COUNT%=%NUMBER:~0,1%
        ECHO VAR%COUNT% is !VAR%COUNT%!
        SET NUMBER=%NUMBER:~1%
        IF NOT "%NUMBER%"=="" (GOTO:LOOP)
        ENDLOCAL
        GOTO:EOF
        

        【讨论】:

          猜你喜欢
          • 2017-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多