提问人:Chad 提问时间:7/5/2023 更新时间:7/5/2023 访问量:75
批处理脚本,用于从变量中减去正确的数字
batch script to subtract correct digits from variables
问:
我试图弄清楚如何根据带有句点 (. ) 的数字从变量中减去正确的信息(我需要)。我知道如何告诉批处理脚本给我一定数量的数字,但如果总数更多(或更少),它就不会给我我需要的信息, 示例
在某些答案上,我当前的脚本会给我 4.129,这是我需要的(句点之前的数字,然后是之后的 3 位数字,但是当句点之前的数字是 2 位或更多时,我得到这个 41.29 并且没有我需要的解决方案的第三位数字。
@echo off
set "File2Read=amts.txt"
If Not Exist "%File2Read%" (Goto :Error)
set count=0
set count2=0
rem This will read a file into an array of variables and populate it
setlocal EnableExtensions EnableDelayedExpansion
FOR /F "tokens=*" %%I IN (%File2Read%) do (
set /a count=count+1
set amt[!count!]=%%~nI
)
:TList
:: Print list of files
for /l %%I in (1,1,!count!) do (
echo %%I] !amt[%%I]!
)
echo.
pause
sqlcmd -S .\Paterson -U sa -P pcAmer1ca -d Website -Q "SET NOCOUNT ON select Price from Inventory WHERE ItemNum = '57'" -h-1 -W > tmp.txt
set /P myVar= < tmp.txt
echo %myVar%
set cost=%myVar:~0,5%
echo %cost%
pause
echo !amt[3]!
for /F "delims=" %%i in ('powershell (!amt[3]! / %cost%^)') do set gal=%%i
set sell=%gal:~0,5%
echo Gallons: %sell%
pause
Exit
::***************************************************
:Error
cls & Color 4C
echo(
echo The file "%File2Read%" dos not exist !
Pause>nul
exit /b
::***************************************************
我无法弄清楚如何获得我正在寻找的结果,任何帮助将不胜感激
有关我尝试过的内容,请参阅上面的代码
使用当前代码,我得到了上述结果
答:
0赞
Stephan
7/5/2023
#1
假设 u 包含一个浮点数 (),您可以将其分解为点前部分和点后部分,在第二部分添加一些零并将其缩短为三个字符并重新组合(以确保点后始终有三个数字)。tmp.txt
<one-or-more-digits><dot><one-or-more-digits>
我把这个反汇编和汇编到一个子程序中,以保持主代码的整洁。
@echo off & setlocal
call :format "0.1" var
echo %var%
call :format "1.234" var
echo %var%
call :format "2.23456" var
echo %var%
call :format "345.6789" var
echo %var%
goto :of
:format
for /f "tokens=1,2 delims=." %%a in ("%~1") do (
set "post=%%b000"
set "%2=%%a.!post:~0,3!"
)
goto :eof
输出:
0.100
1.234
2.234
345.678
评论
0赞
Chad
7/5/2023
这应该有效,但我正在寻找修复名为%sell%的代码部分中的变量(结果)...echo !amt[3]!for /F “delims=” %%i in ('powershell (!amt[3]! / %cost%^)') do set gal=%%i set sell=%gal:~0,5% echo 加仑: %sell% ...
0赞
Stephan
7/5/2023
call :format "%gal%" sell
0赞
Chad
7/5/2023
好的,我将测试您的解决方案,并感谢您如此好心地为您的时间提供经验,为我提供此帮助
0赞
Chad
7/5/2023
您的解决方案再次运行良好,感谢您的时间、帮助和帮助。我现在唯一的问题是由于某种原因,当我从 bat 文件输入值时,我的程序数学不起作用(但那是在我使用的程序中,而不是 bat 文件)
0赞
Stephan
7/5/2023
不用担心,这就是我们来这里的目的。你可能想为你的数学问题问另一个问题(记得使用正确的标签)
0赞
Aacini
7/5/2023
#2
嗯。。。恐怕我真的不明白你想要什么(“减去正确的数字”是什么意思?...您的描述令人困惑,并且您(长)发布的代码没有显示重要的一点:文件的内容......无论如何,我认为我的答案可以帮助你。tmp.txt
在 Batch 文件中,命令管理整数 32 位数字,允许管理长达 9 位的十进制数。您可以将这 9 位数字拆分为整数和小数部分,并对它们执行简单的算术运算(本答案中描述的定点算术),只要中间结果(主要是乘法和除法)不会溢出 9 位容量。在这里:set /A
@echo off
setlocal EnableDelayedExpansion
set /P "decimals=Enter the number of decimals: "
set /A "decimalsP1=decimals+1, ONE=1"
for /L %%i in (1,1,%decimals%) do set "ONE=!ONE!0"
echo Enter numbers with digits at left of decimal point (like 0.25 not .25)
:loop
echo/
set /P "first=Enter first number: "
if errorlevel 1 goto :EOF
set /P "second=Enter second number: "
call :numToFP FPA=%first%
call :numToFP FPB=%second%
set /A "add=FPA+FPB, sub=FPA-FPB, mul=FPA*FPB/ONE, div=FPA*ONE/FPB
call :FPToNum add=%add%
call :FPToNum sub=%sub%
call :FPToNum mul=%mul%
call :FPToNum div=%div%
echo %first% op %second%: Add = %add%, Sub = %sub%, Mul = %mul%, Div = %div%
goto loop
:numToFP FPvar=num
for /F "tokens=1,2 delims=." %%a in ("%~2") do (
set "frac=%%b%ONE:~1%"
set "%1=%%a!frac:~0,%decimals%!"
)
:cutZeros
if not defined %1 set "%1=0" & exit /B
if "!%1:~0,1!" equ "0" set "%1=!%1:~1!" & goto cutZeros
exit /B
:FPToNum var=FPnum
set "FP=%~2"
if "!FP:~%decimals%!" equ "" set "FP=%ONE:~1%%FP%" & set "FP=!FP:~-%decimalsP1%!"
set "%1=!FP:~0,-%decimals%!.!FP:~-%decimals%!"
exit /B
这样,您就不需要(缓慢的)PowerShell 来执行简单的除法。举个例子:
Enter the number of decimals: 3
Enter numbers with digits at left of decimal point (like 0.25 not .25)
Enter first number: 123
Enter second number: 0.456
123 op 0.456: Add = 123.456, Sub = 122.544, Mul = 56.088, Div = 269.736
评论