Board logo

标题: 批处理提取变量中的数字 [打印本页]

作者: 随风    时间: 2007-11-22 15:50     标题: 批处理提取变量中的数字

@echo off
set "str=f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理s86h7shh7gh8jiagn"
无聊出个题,大家玩玩
将变量str中的数字提取出来,并显示有多少个数字

[ 本帖最后由 随风 于 2007-11-22 16:48 编辑 ]
作者: foxJL    时间: 2007-11-22 23:10

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set "str=0000f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理s86h7shh7gh8jiagn0"
  4. for /l %%i in (0,1,200) do (if "!str:~%%i,1!"=="0" (set /a num+=1 & set/p=!str:~%%i,1!<nul) else (set /a a=0/!str:~%%i,1!>nul 2>nul && ((set /a num+=1)&(set/p=!str:~%%i,1!<nul))))
  5. echo.共!num!个数字.&pause>nul
复制代码

[ 本帖最后由 泛滥棏慌° 于 2007-11-22 23:46 编辑 ]
作者: 随风    时间: 2007-11-22 23:52

不错的判断方法!
作者: youxi01    时间: 2007-11-23 07:55

原帖由 泛滥棏慌° 于 2007-11-22 23:10 发表

@echo off
setlocal EnableDelayedExpansion
set "str=0000f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理s86h7shh7gh8jiagn0"
for /l %%i in (0,1,200) do (if "!str:~%%i,1!"=="0" (set /a num+=1 ...


非常不错的判断方法,利用算式能否正确运行来判断是否是数字...

另外一种思路还可以通过直接判断字符大小来判断是否是数字(本人常用)....
作者: novaa    时间: 2007-11-23 08:02

呵呵谢谢出题练习
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set num=0
  4. set "str=f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理s86h7shh7gh8jiagn"
  5. for /l %%a in (0 1 9) do call set str=!!str:%%a=1!!
  6. for /l %%a in (0 1 200) do (set str%%a=!str:~%%a,1!
  7. if /i "!str%%a!" equ "1" (set /a num+=1)
  8. )
  9. echo !num!
  10. pause>nul
复制代码

作者: 随风    时间: 2007-11-23 17:06

哈哈.
我也来一个,不需要判断的......
  1. @echo off&setlocal EnableDelayedExpansion
  2. set "str=f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理s86h7shh7gh8jiagn"
  3. for %%a in (%str%) do set var=!var!%%a
  4. for /l %%a in (0 1 9) do set var=!var:%%a=%%a !
  5. for %%a in (%var%0) do (
  6.   set num=%%a
  7.   set max=!max!!num:~-1!
  8.   set /a ci+=1
  9. )
  10. set /a ci-=1
  11. echo !max:~0,-1! 共有 !ci! 位数
  12. pause>nul
复制代码

作者: novaa    时间: 2007-11-23 18:33     标题: 哈哈,通过楼主教我的调试方法,看懂了

下面是我得出的结论,不知道对否
for %%a in () 这个默认是以 ; , 空格为分隔符的
第一步
  1. for %%a in (%str%) do set var=!var!%%a
  2. for /l %%a in (0 1 9) do set var=!var:%%a=%%a !
复制代码

就是去掉str中的分号,逗号,空格 并且 在数字后加空格,为后面的做铺垫
set var=!var!%%a 这句的意思是吧新取的值接到原值后面。
所以
  1. for %%a in (%var%0) do (
  2. set num=%%a
  3. set max=!max!!num:~-1!
  4. set /a ci+=1
  5. )
复制代码

是利用max来取数字
用ci来统计数字个数
呵呵
后面的ci-=1是由于%var%0 ,这样多算了一次
OK
作者: 随风    时间: 2007-11-23 18:53

完全正确,进步快啊!!
作者: novaa    时间: 2007-11-23 20:37

呵呵
谢谢随风的教导,使自己学习更上一层
呵呵
作者: myweb9169    时间: 2007-12-29 23:38

7楼说for默认分隔符是;和空格还有;可我看教程说只有空格和跳格符啊,到底是啥啊,各位老大给个说法,都晕了
作者: novaa    时间: 2007-12-30 00:20

原帖由 myweb9169 于 2007-12-29 23:38 发表
7楼说for默认分隔符是;和空格还有;可我看教程说只有空格和跳格符啊,到底是啥啊,各位老大给个说法,都晕了


我也不太清楚了。好像要看情况
不同情况分隔符不同
在FOR %%I IN ()
和FOR /F %%I IN ()不一样
自己测试测试。我明天也测试测试。
累了。。

[ 本帖最后由 novaa 于 2007-12-30 00:24 编辑 ]
作者: heiing    时间: 2008-2-17 16:10

我测试了以上代码,似乎都未符合题意,试试这个
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set num=0
  4. set result=
  5. set tmpstr=
  6. set "str=f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理s86h7shh7gh8jiagn"
  7. echo 字符串:%str%
  8. for /l %%i in (0,1,255) do (
  9.   set tmpstr=!str:~%%i,1!
  10.   if "!tmpstr!"=="" goto end
  11.   if !tmpstr! leq 9 if !tmpstr! geq 0 set result=!result!!tmpstr!&& set /a num+=1
  12. )
  13. :end
  14. echo 数字子串:  !result!
  15. echo 数字个数:  !num!
复制代码

作者: 梦想种子    时间: 2008-4-27 18:28

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "str=0000f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理
  4. s86h7shh7gh8jiagn0"
  5. :next
  6. set a=!str:~0,1!
  7. set /a r=^a
  8. if !a! == 0 set/p=!0<nul&set/a c+=1
  9. if !r! neq 0 set/p=!a!<nul&set/a c+=1
  10. set str=!str:~1!
  11. if defined str goto next
  12. echo 共!c!个数字
  13. pause>nul
复制代码
这个也可以噢...
刚才发现,开了变量延迟后,在set /a的使用中,单一个!感叹号和脱字符^的作用是一样的。

[ 本帖最后由 心系自然 于 2008-4-27 19:34 编辑 ]
作者: 随风    时间: 2008-4-27 18:59     标题: 回复 13楼 的帖子

不错,提个建议
set/p=^0<nul
应该这样写,否则0显示不出,在显示单个数字时都要注意,因为它们都有不同的含义。
作者: 梦想种子    时间: 2008-4-27 19:37     标题: 回复 14楼 的帖子

噢,原来真的是这样吖...
对了,开了变量延迟,set/p=!0<nul,这样也可以噢...




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2