[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何给数字添加千分位分隔符?

数据位数不定0~7位
正负不定
怎么每隔三位以","号分割输出


是纯数字
试了好多办法
都不完美
比如除法运算
或者%value:~-6,3%这样的

本帖最后由 happy886rr 于 2016-3-17 23:39 编辑

回复 50# sishentibu

你把文件名改改。1 (2).cmd这个名字既有空格又有小括号。批处理遇到有空格小括号的文件名,自然会出错。换个名字。

TOP

回复 48# happy886rr

我测试了下,貌似还是存在问题。有2个方面。
第一个,还是我前面给过的那个批处理,文件名1 (2).cmd,直接就一闪而过了
  1. @echo off
  2. set /p=<nul >url.txt
  3. for /f %%i in (dnsserver.txt) do (
  4. echo %%i>>url.txt
  5. echo %%ipage/2/>>url.txt
  6. echo %%ipage/3/>>url.txt)
  7. pause
复制代码
第二个问题,用你的上一个解决方案,那个批处理本身是可以运行的。但是用这个批处理处理后,生成文件再运行,却出错了。

所以,我在想,是不是我们一开始的方向就有问题?

==================================================
关于这个批处理,我也有疑问
第二行,这个有用处?
第四行,为什么要用type命令呢?%1不是本身就表示拖过来的文件吗(虽然我自己试了,直接用1%有点问题)
第五行,call命令我查看了cmd的帮助,貌似没这种用法的解释?而且为什么n两边是2对%。。
第七行,set /p可以解决echo时候的%,!问题?这个我再测试下。

TOP

回复 48# happy886rr


    我不想打击你,用批处理拖拽,它这么弄都不能够算完美

TOP

回复 47# sishentibu
我改进了方法,这回可以完美支持所有批处理了。批处理一键拖拽调试器,支持带有空格的任意特殊路径。任意字符串。
  1. @echo off
  2. if %1=="" exit
  3. set n=1
  4. (for /f "delims=" %%i in ('type %1') do (
  5. call,echo @echo ---第%%n%%行---
  6. set /a n+=1
  7. set /p =%%i<nul
  8. echo,&echo pause^>nul&echo,
  9. )
  10. )>.\正在调试_%~nx1
  11. start .\正在调试_%~nx1
复制代码

TOP

回复 47# happy886rr


    我想了下,貌似出问题的,基本都会有%%,!!之类的。然后这类却不支持。。。

TOP

回复 46# sishentibu
差不多就是逐行运行,停到哪有行号,再下一步闪退,就知道是第几行出错了。

TOP

回复 45# happy886rr


    我直接拿来测试了下,稍微有点问题。
  1. echo echo ----^>第!i!行
复制代码
这里的>貌似有点问题,有这个的时候,我处理后的批处理运行不了,去掉就好了(虽然我知道这个只是显示用的)

另外,你说的“处理另一个批处理时遇到!!或者%%号就扩展了”不的很清楚表达的意义,但实际情况确实是包含%%的批处理无法处理,直接一闪而过了。例如
  1. @echo off
  2. set /p=<nul >url.txt
  3. for /f %%i in (dnsserver.txt) do (
  4. echo %%i>>url.txt
  5. echo %%ipage/2/>>url.txt
  6. echo %%ipage/3/>>url.txt)
复制代码
看了处理结果后,我感觉是不是可以不用这么麻烦。因为序号是一行一个,for /f也是一次读取一行,那么直接计数不就好了吗,也就不用读取行号了。

对于这种方法,我简单的测试了下。对于正确的地方没的说。但是错误的地方,如果有括号的,如for之类的,是不是只要括号中的内容有误,就直接退出了?然后我就可以先检查这个语句?

TOP

回复 42# happy886rr

这两天头痛,懒的测试。我过几天在在虚拟机中改系统时间测试下

“第二个问题另外做个批处理给要调试的批处理每行下添加pause和行号,方便你知道运行到第几行。”,我明白你要表达的意思,但是我不会。。。
目前我就是for,set,echo,if 之类的用的多点,findstr之类的基本就没用过。。

TOP

本帖最后由 happy886rr 于 2016-3-15 15:09 编辑

回复 38# CrLf
这个算法收敛很快,4次循环就可得到8位有效派值,遇到的问题主要是浮点运算,我的核心算法是
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set t=100000000
  4. set /a pi=t-t/2-t/5-t/6
  5. for /l %%i in (1 1 4) do (set /a pi=((4*t/(8*%%i+1^)-2*t/(8*%%i+4^)-t/(8*%%i+5^)-t/(8*%%i+6^)^)^>^>4*%%i^)+pi)
  6. echo 3.!pi!
  7. pause
复制代码
在往后边循环,由于浮点运算的关系,我需要用bat模拟浮点运算,或者用快速模幂乘。后边的设计比较复杂,包括余项的处理。
1

评分人数

    • CrLf: 鼓励钻研技术 + 1

TOP

回复 40# sishentibu
你写的(!t2:~3,2!-!t1:~3,2!)就是在截取分钟,万一是8点09分,你试试看批处理会不会疯掉。第二个问题另外做个批处理给要调试的批处理每行下添加pause和行号,方便你知道运行到第几行。

TOP

回复 39# CrLf


    反括号指的是 ) ?
刚才查了下,貌似是说,第一个)会去跟 do ( 这个括号配对去了。
对于进行转义,我还是有点疑惑。
转义的意思,不是把特殊作用的字符,转换成普通显示的字符吗?
但我实际中,是需要它在for内部跟前一个(配对。如果把)转义成普通字符了,那这个)还会跟前一个(配对?
如果语句写的比较复杂,括号套括号的时候,是不是同样也有这个问题?如果有三层,四层括号,按这个逻辑,貌似就算加了转义,里面的配对情况依然会乱吧?

TOP

回复 35# happy886rr


    这个我倒是没注意,我晚上加1试试
不过有2个问题,我看CrLf 貌似有不同意见
还有,我自己在win7下试过,貌似截取出来的是“ 8:30" 类似的,而不是”08:30“,就是直接为空的,而不是0

另外,那个给批处理加暂停的那个解释我没看懂啊

TOP

回复 34# sishentibu


    在 for 里要注意对反括号进行转义,否则容易造成语法错误

TOP

回复 37# happy886rr


    不了解,好像没见过符合条件的公式

TOP

返回列表