让我说我的批处理文件中有这个:
set var1=12345
我想在第一个变量(var1)中添加逗号并将其保存到另一个变量(var2)。
这意味着第二个变量(var2)应该具有以下值: 12,345 。
因此,如果第一个变量(var1)具有此值:123456789,则第二个(var2)值必须为123,456,789。
有什么想法吗?
修改
我不想要PowerShell命令,因为这对我不起作用。 请写,不用 PowerShell。
答案 0 :(得分:4)
另一个!
@echo off
setlocal EnableDelayedExpansion
set "var1=%1"
echo First variable: %var1%
set "var2="
set "sign="
if "%var1:~0,1%" equ "-" set "sign=-" & set "var1=%var1:~1%"
for /L %%i in (1,1,4) do if defined var1 (
set "var2=,!var1:~-3!!var2!"
set "var1=!var1:~0,-3!"
)
set "var2=%sign%%var2:~1%"
echo Second variable: %var2%
如果要增加位数,只需将for
命令中的组数增加到大于4的值。
答案 1 :(得分:2)
与纯批次有点棘手。这是一个有效的解决方案,利用:strlen function来确定字符串的长度。 :showThousands函数可以使用任何整数,正数或负数,最多可达8191位数。该函数仅修改可选择以-
开头的值,然后余数仅由数字组成。
@echo off
setlocal enableDelayedExpansion
for %%N in (
1
12
123
1234
12345
123456
1234567
123456789
1234567890
12345678901234567890
-12345678901234567890
fred
123456.789
) do (
set input=%%N
call :showThousands input output
echo !input! --^> !output!
)
exit /b
:showThousands inVar outVar
setlocal enableDelayedExpansion
set num=!%~1!
set "sign="
if %num:~0,1% equ - (
set "sign=-"
set "num=%num:~1%"
)
for /f "delims=0123456789" %%A in ("%num%") do goto :showThousandsReturn
call :strlen len num
if %len% leq 3 goto :showThousandsReturn
set /a end=len%%3
if %end% equ 0 set /a end=3
set /a start=(len-4)/3*3+end
for /l %%N in (%start% -3 %end%) do set "num=!num:~0,%%N!,!num:~%%N!"
:showThousandsReturn
endlocal & set "%~2=%sign%%num%"
exit /b
:strlen <resultVar> <stringVar>
(
setlocal EnableDelayedExpansion
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
)
(
endlocal
set "%~1=%len%"
exit /b
)
- 输出 -
1 --> 1
12 --> 12
123 --> 123
1234 --> 1,234
12345 --> 12,345
123456 --> 123,456
1234567 --> 1,234,567
123456789 --> 123,456,789
1234567890 --> 1,234,567,890
12345678901234567890 --> 12,345,678,901,234,567,890
-12345678901234567890 --> -12,345,678,901,234,567,890
fred --> fred
123456.789 --> 123456.789
答案 2 :(得分:1)
批处理不是一种很好的语言来进行这种复杂的字符串操作。对于大多数人,我建议使用PowerShell进行繁重的工作。
for /f %%a in ('powershell -c "'{0:N0}' -f %var1%"') do set var2=%%a
如果您需要一个纯粹的批处理解决方案,您可以使用更多代码迭代地完成。此示例适用于32位整数。对于较大的数字或浮点数,请参阅@ dbenham的答案。
@echo off
:: in: Integer value (must fit into 32 bits)
:: Out: Prints that value with commas after each 3 digits
setlocal
set /a num = %1
set output=
:: Check for trivial zero case and any non-number string input
if {%num%}=={0} (
echo 0
goto :eof
)
:nextgroup
if %num:-=% LSS 1000 goto :lastgroup
set output=,%num:~-3%%output%
set /a num = %num% / 1000
goto :nextgroup
:lastgroup
set output=%num%%output%
endlocal && echo.%output%
示例:
> thousands.cmd 1000
1,000
> thousands.cmd -876543210
-876,543,210
> thousands.cmd 0
0
> thousands.cmd -512
-512
> thousands.cmd fred
0
答案 3 :(得分:1)
set var2=%var1:~0,-3%,%var1:~-3%
答案 4 :(得分:0)
SET var2=%var1%,5
应该完成这项工作。
答案 5 :(得分:0)
快速简便的解决方案。您可以将其保存为批处理,并以您的数字作为参数来调用它,或者将其嵌入到正在编写的任何脚本中。
说明:
如果输入值val大于999,则将“ newval”设置为逗号,并设置“ val”的后三位,然后将val的后三位剪掉。
循环直到val不再超过3位,转储输出。
@Reusable
如果您真的需要处理负数,请改用它。
setlocal
set val=%1
:loop
if %val% GTR 999 (set newval=,%val:~-3%%newval% & set val=%val:~0,-3%
goto loop
)
echo %val:~-3%%newval%
当然,这不会处理不好的输入,但是又简短又甜美。
答案 6 :(得分:0)
我认识的聚会晚了一点,但这可能对像我这样迟到的人有用。 该方法采用基本的SET替换技术。它还支持带前导[-]符号的负整数。 这是一个静态解决方案,因为它应用了任意的最大输入位数,但是可以对其进行修改以适合要求。 对于那些对性能感兴趣的人,它比FOR循环解决方案要快。
:: Sample code is for max 21 (-20) digit numbers
:: For larger numbers increase pad size and extend the "preset commas" instruction
:: with leading " %var1:~-NN,3%, " where NN increments by 3
:: The only limit would seem to be variable VAR2 maximum size
:: Note: no size check nor numeric integrity is applied, if input size exceeds
:: design max top digits are simply lost
rem Left pad input with 20 [max-1] characters of your choice [except comma]
rem 12345678901234567890
set var1=####################%1
rem preset comma separators
set var2=%var1:~-21,3%,%var1:~-18,3%,%var1:~-15,3%,%var1:~-12,3%,%var1:~-9,3%,%var1:~-6,3%,%var1:~-3%
rem remove redundant chars
set var2=%var2:#,=%
set var2=%var2:#=%
rem only needed if -nn negative numbers are to be supported
set var2=%var2:-,=-%
ECHO %1 ==^> %var2%