千位分隔符的整数值

时间:2015-02-24 15:42:07

标签: batch-file

让我说我的批处理文件中有这个:

set var1=12345

我想在第一个变量(var1)中添加逗号并将其保存到另一个变量(var2)

这意味着第二个变量(var2)应该具有以下值: 12,345

因此,如果第一个变量(var1)具有此值:123456789,则第二个(var2)值必须为123,456,789。

有什么想法吗?

修改

我不想要PowerShell命令,因为这对我不起作用。 请写,不用 PowerShell。

7 个答案:

答案 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的答案。

thousands.cmd

@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%