标题: 批处理提取变量中的数字 [打印本页]
作者: 随风 时间: 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
- @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 & 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))))
- 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
呵呵谢谢出题练习- @echo off
- setlocal enabledelayedexpansion
- set num=0
- set "str=f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理s86h7shh7gh8jiagn"
- for /l %%a in (0 1 9) do call set str=!!str:%%a=1!!
- for /l %%a in (0 1 200) do (set str%%a=!str:~%%a,1!
- if /i "!str%%a!" equ "1" (set /a num+=1)
- )
- echo !num!
- pause>nul
复制代码
作者: 随风 时间: 2007-11-23 17:06
哈哈.
我也来一个,不需要判断的......- @echo off&setlocal EnableDelayedExpansion
- set "str=f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理s86h7shh7gh8jiagn"
- for %%a in (%str%) do set var=!var!%%a
- for /l %%a in (0 1 9) do set var=!var:%%a=%%a !
- for %%a in (%var%0) do (
- set num=%%a
- set max=!max!!num:~-1!
- set /a ci+=1
- )
- set /a ci-=1
- echo !max:~0,-1! 共有 !ci! 位数
- pause>nul
复制代码
作者: novaa 时间: 2007-11-23 18:33 标题: 哈哈,通过楼主教我的调试方法,看懂了
下面是我得出的结论,不知道对否
for %%a in () 这个默认是以 ; , 空格为分隔符的
第一步- for %%a in (%str%) do set var=!var!%%a
- for /l %%a in (0 1 9) do set var=!var:%%a=%%a !
复制代码
就是去掉str中的分号,逗号,空格 并且 在数字后加空格,为后面的做铺垫
set var=!var!%%a 这句的意思是吧新取的值接到原值后面。
所以- for %%a in (%var%0) do (
- set num=%%a
- set max=!max!!num:~-1!
- set /a ci+=1
- )
复制代码
是利用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
我测试了以上代码,似乎都未符合题意,试试这个- @echo off
- setlocal enabledelayedexpansion
-
- set num=0
- set result=
- set tmpstr=
- set "str=f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理s86h7shh7gh8jiagn"
- echo 字符串:%str%
-
- for /l %%i in (0,1,255) do (
- set tmpstr=!str:~%%i,1!
- if "!tmpstr!"=="" goto end
- if !tmpstr! leq 9 if !tmpstr! geq 0 set result=!result!!tmpstr!&& set /a num+=1
- )
-
- :end
- echo 数字子串: !result!
- echo 数字个数: !num!
复制代码
作者: 梦想种子 时间: 2008-4-27 18:28
- @echo off
- setlocal enabledelayedexpansion
- set "str=0000f.h5h,h87h非fh好46hs 7df,asf8,hsf dh;58gh7.6sh4批:处理
- s86h7shh7gh8jiagn0"
- :next
- set a=!str:~0,1!
- set /a r=^a
- if !a! == 0 set/p=!0<nul&set/a c+=1
- if !r! neq 0 set/p=!a!<nul&set/a c+=1
- set str=!str:~1!
- if defined str goto next
- echo 共!c!个数字
- 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 |