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

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

[复制链接]
发表于 2016-3-14 19:20:02 | 显示全部楼层
回复 30# sishentibu
set a=%%i这个必须有。
我发现for和if比goto运行的速度快很多,所以我那个分割可以写成for的,速度简直快了几十倍,还有批处理居然按行读取硬盘的bat文件,因此我把for循环弄成一行,让机器一次读完一个for语句。我设置为1000次循环,即最大3000位数字截取,运行速度快的惊人。

  1. @echo off&setlocal enabledelayedexpansion
  2. set /p num=输入数字:
  3. for /l %%i in (1 1 1000) do (if !num! equ 0 (set p1=!p1:-,=-!&set /p =!p1:~1!) else (set p1=,!num:~-3!!p1!&set num=!num:~0,-3!))
复制代码
另外我发现用for /l这个可以加快计算圆周率和开平方的速度.
发表于 2016-3-14 19:32:06 | 显示全部楼层
回复 31# happy886rr


    你研究的可够多的
批处理按行处理,这个我在论坛的基础教程里面有看到过的。
而且,我现在处理的东西都比较小,所以对于效率这块不是很注意。虽然我看到很多说goto的效率低,但我个人感觉,写成goto的形式,对于分类处理的东西更好写。。
另外,批处理有没有类似按行运行的办法的?因为我不是很熟悉,经常要把批处理改很多次才能达到最终要求。试过加pause,但行数一多就感觉好麻烦。而且有时碰到一闪而过的,更不好判断哪里的问题了
发表于 2016-3-14 19:46:25 | 显示全部楼层
回复 32# sishentibu
这个好办。用token findstr /n,截取bat文件。然后将行号和pause都echo到bat文件的每一行下,就是你写个批处理给你要测试的bat添加pause和行号,方便你查错。
发表于 2016-3-14 20:58:21 | 显示全部楼层
回复 33# happy886rr
没懂。。可以帮我举个例子吗,就用楼上你写的代码

刚才写的时候又碰到个问题。关于时间的处理的。
手动设置t1,t2时间,然后用下面代码是可以的
  1. set /a t=(%t2:~0,2%-%t1:~0,2%)*60+(%t2:~3,2%-%t1:~3,2%)
复制代码
但我在for /f 语句中,读取到时间,对时间进行计算就变成一闪而过了,这个哪里有问题?
  1. set /a t=(!t2:~0,2!-!t1:~0,2!)*60+(!t2:~3,2!-!t1:~3,2!)
复制代码
发表于 2016-3-14 21:24:36 | 显示全部楼层
回复 34# sishentibu
批处理遇到0开头的就当八进制处理了,遇到0x开头的就16进制计算了,计算时间差这块需要加个100就行了,然后截取。
发表于 2016-3-14 21:30:44 | 显示全部楼层
回复 35# happy886rr


    不用截取,两部分抵消了
发表于 2016-3-14 22:51:52 | 显示全部楼层
回复 36# CrLf
是set/a 1!t2:~3,2!-1!t1:~3,2!,加前缀1?
另外我看到大师 2013年的 关于批处理计算圆周率的三个方案.我发现了一个收敛速度快1000倍的公式,这样就实现了计算圆周率的模块化。可以直接计算第n位,
pi=2*1+2*1!/3!!+2*2!/5!!+2*3!/7!!+...+2*k!/(2*k+1)!!+...这个公式的收敛速度只有2,而且分母不是2。需要分母是2的次幂的公式,这样除以2的次幂就相当于移位>>
发表于 2016-3-15 00:15:27 | 显示全部楼层
回复 37# happy886rr


    不了解,好像没见过符合条件的公式
发表于 2016-3-15 02:18:06 | 显示全部楼层
回复 34# sishentibu


    在 for 里要注意对反括号进行转义,否则容易造成语法错误
发表于 2016-3-15 11:50:17 | 显示全部楼层
回复 35# happy886rr


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

另外,那个给批处理加暂停的那个解释我没看懂啊
发表于 2016-3-15 12:03:10 | 显示全部楼层
回复 39# CrLf


    反括号指的是 ) ?
刚才查了下,貌似是说,第一个)会去跟 do ( 这个括号配对去了。
对于进行转义,我还是有点疑惑。
转义的意思,不是把特殊作用的字符,转换成普通显示的字符吗?
但我实际中,是需要它在for内部跟前一个(配对。如果把)转义成普通字符了,那这个)还会跟前一个(配对?
如果语句写的比较复杂,括号套括号的时候,是不是同样也有这个问题?如果有三层,四层括号,按这个逻辑,貌似就算加了转义,里面的配对情况依然会乱吧?
发表于 2016-3-15 12:35:47 | 显示全部楼层
回复 40# sishentibu
你写的(!t2:~3,2!-!t1:~3,2!)就是在截取分钟,万一是8点09分,你试试看批处理会不会疯掉。第二个问题另外做个批处理给要调试的批处理每行下添加pause和行号,方便你知道运行到第几行。
发表于 2016-3-15 13:01:12 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
CrLf + 1 鼓励钻研

查看全部评分

发表于 2016-3-16 23:17:33 | 显示全部楼层
回复 42# happy886rr

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

“第二个问题另外做个批处理给要调试的批处理每行下添加pause和行号,方便你知道运行到第几行。”,我明白你要表达的意思,但是我不会。。。
目前我就是for,set,echo,if 之类的用的多点,findstr之类的基本就没用过。。
发表于 2016-3-17 12:34:42 | 显示全部楼层
回复 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之类的,是不是只要括号中的内容有误,就直接退出了?然后我就可以先检查这个语句?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 00:16 , Processed in 0.022677 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表