Board logo

标题: [已结]请教如何将字符转换成数字的问题 [打印本页]

作者: smileseeker     时间: 2006-4-9 12:40    标题: [已结]请教如何将字符转换成数字的问题

如有:
0005
0020
0036
0303


如何将以上各个字符串转换成


5
20
36
303


平台:WINXP

[ Last edited by willsort on 2006-4-10 at 12:46 ]
作者: chenhui530     时间: 2006-4-9 13:27
set a=0005
set /a b=%a%+0
echo %b%
set c=0020
set /a d=%c%+0
echo %d%
set e=0036
set /a f=%e%+0
echo %f%
set g=0303
set /a h=%g%+0
echo %h%
作者: smileseeker     时间: 2006-4-9 17:10
谢谢 !

原来这样也行,厉害
作者: smileseeker     时间: 2006-4-9 17:31
还是发现一个问题

当数字8,9前有0时就不行了

也就是8进制的表示问题
作者: chenhui530     时间: 2006-4-9 18:14
其实还可以这样的%a:0=%
比如
set a=0008
set b=%a:0=%
echo %b%
作者: willsort     时间: 2006-4-9 18:42
Re chenhui530:

      set b=%a:0=% 仍然存在问题,比如对 0020 的处理。

      对于长度固定为4的数字串,可以考虑以下方案:

      set n=0020
      set /a n=1%n%-10000
作者: chenhui530     时间: 2006-4-9 19:06
呵呵
好久没看到willsort兄了
作者: smileseeker     时间: 2006-4-9 19:16
谢谢二位!!!问题解决了

小弟的字符串刚好都是一样的位数
作者: doscc     时间: 2006-4-10 11:17
2楼.兄弟 和 6楼版主
的思路不错啊.
把数字字符串 通过加减运算来去掉不用的0
作者: kcdsw     时间: 2006-4-10 20:23    标题: 别急着结啊,我这还有问题呢


echo ----------------------------执行信息----------------------------
For %%a in (*.pdf) do call :name "%%a"
echo ----------------------------------------------------------------
echo 执行完毕,按任意键退出
pause >nul
exit

:name
set name="%~n1"
set name=%name:~-5%
if %name:~0,1%==0 set /a name=1%name%-10000
rename %1 %name%.pdf
echo %~n1.pdf 改名为 %name%.pdf
goto :eof
这个就可以用了,但是还有点小问题没搞定呢
希望大家给点思路  

我的文件都是四位数字前面还有字符的 比如 20060410190040_ps_p0040.pdf
或者 农电全文最新_ps_p0021.pdf
执行的时候如果说这个文件主名本身不够4个字符的时候就会出错(因为我已经执行过一次,执行过的文件主名都不到4位了,它执行到set name=%name:~-5%)的时候就出错了

[ Last edited by kcdsw on 2006-4-10 at 20:27 ]
作者: 无奈何     时间: 2006-4-10 23:47
TO: kcdsw
可以尝试下面的代码.

  Quote:

  1. @echo off
  2. echo ----------------------------执行信息----------------------------
  3. for /f "delims=" %%a in (' dir /b *.pdf ') do  call :name "%%a"
  4. echo ----------------------------------------------------------------
  5. echo 执行完毕,按任意键退出
  6. pause >nul
  7. exit

  8. :name
  9. set name=%~1
  10. ::以下两句删除下划线之前的字符
  11. set name=%name:*_=%
  12. set name=%name:*_=%

  13. ::以下循环可以删除前导字母和零
  14. :loop
  15. set m=%name:~0,1%
  16. if "%m%" LEQ "9" (
  17.                 if "%m%" GTR "0" (
  18.                 echo rename %1 "%name%"
  19.                 rename %1 "%name%" >nul
  20.                 goto :EOF
  21.                 )
  22.         )
  23. set name=%name:~1%
  24. goto loop

  25. goto :EOF
        -=代码着色  BY:无奈何=-

根据 willsort 兄的提醒修正了一下,请注意第三行与 kcdsw 兄原帖的区别。

[ Last edited by 无奈何 on 2006-4-14 at 19:04 ]
作者: kcdsw     时间: 2006-4-11 13:12
呵呵 首先谢谢无奈何兄
不过我这里的文件有个特点,后面都是四位的数字,而前面的字符不定有可能有2个或者3个以上的下划线
唯一能摸到规律的就是后四位数字.
pdf是与页面相关的,每个文档是一页,每个数字是与其相关的页码
一般书不会超过9999页(至少我这里没有),所以没考虑10000页及其上的页面的容错

刚用无奈何兄写的pdf大概测试了一下,存在一个问题    文件名会被改错掉
作者: xuantian     时间: 2006-4-11 15:49
干嘛非得用批处理不可,用UE32或者ACDSee都是非常方便的
作者: kcdsw     时间: 2006-4-11 19:51
是在执行其他的bat的时候调用它
作者: GOTOmsdos     时间: 2006-4-11 21:21
用C的 atoi 写个小程序就结啦!
作者: 无奈何     时间: 2006-4-11 21:53
kcdsw 兄能否提供一下出错的文件列表.
用批处理来完成复杂的文件重命名,只是讨论CMD下批处理的字符处理问题,其实效率很低,也无法解决一些特殊字符的应用限制.
如果只是纯粹的应用,用来解决问题的话,第三方的工具是个不错的选择.推荐一款命令行下的支持正则表达式的重命名工具 bkren 下载地址:http://www.orbit.org/renamer/
解决你的问题应该很轻松.
作者: kcdsw     时间: 2006-4-12 12:45    标题: 呵呵 谢谢你啊~~

我把图贴上了

另外我把lss改成leq了

问题应该出在这里了

[ Last edited by kcdsw on 2006-4-12 at 12:48 ]
附件 1: 新建 BMP 图像.JPG (2006-4-12 12:45, 64.98 K, 下载附件所需积分 1点 ,下载次数: 9)



作者: 无奈何     时间: 2006-4-12 19:47
LSS 确实该改为 LEQ,我大意了,改一下原帖.
作者: willsort     时间: 2006-4-14 18:05
Re 无奈何:

      记得以前与兄就 for文件遍历中出现的重复操作问题 曾有讨论[1],那时得出的结论是使用for/f分析dir结果的静态分析方案,这样就避免了很多问题,例如若要实现给文件名添加动态前缀或后缀的代码,使用非静态算法便很麻烦,很难对已操作文件进行排除。

[1] 已结:[转帖求助]一个批量命名的批处理
http://www.cn-dos.net/forum/viewthread.php?tid=18108

[ Last edited by willsort on 2006-4-14 at 18:07 ]
作者: 无奈何     时间: 2006-4-14 19:01
谢谢 willsort 兄的提醒。
最近因为时间问题,来的少了一些。
由于只是一味关注本帖提出的字符处理需求,没有过多的考虑主循环调用的部分,所以保持了 kcdsw 兄的程序前半部分原样,也没有做详细的测试。再修正一下。
作者: kcdsw     时间: 2006-4-14 20:33
呵呵  刚才我正好在调试 发现会把第一次重命名了的文件再进for中执行一次,正发愁呢忽然看到你们的回复  真是太感谢了

另外我把无奈何兄的代码小改了一下

echo 信息放在了 rename语句的后面  而且是成功了才执行 呵呵

谢谢斑竹和无奈何兄
@echo off
echo ----------------------------执行信息----------------------------
for /f "delims=" %%a in ('dir /b *.pdf') do call :name "%%a"
echo ----------------------------------------------------------------
echo 执行完毕,按任意键退出
pause >nul
exit

:name
set name=%~1
::以下两句删除下划线之前的字符
set name=%name:*_p=%
set name=%name:*_p=%


::以下循环可以删除前导字母和零
:loop
set m=%name:~0,1%
if "%m%" LEQ "9" (
if "%m%" GTR "0" (
rename %1 "%name%" 2>nul &&echo %1更名为"%name%" ||echo 无法重名文件%1,存在同名文件%name%或者文件已打开

goto :EOF
)
)
set name=%name:~1%
goto loop

goto :EOF
[ Last edited by kcdsw on 2006-4-14 at 20:57 ]