hans87
Goto Top

Kommastellen in Batch

Hallo,

ich habe folgendes Problem:

ich Frage eine per sqlplus ab... die Ausgabe sieht folgendermaßen aus:


C:\>set /a WERT2=4335247.73856934
Fehlender Operator

C:\>echo 4335247
4335247


Das Echo will ich später auch in eine Datei schreiben.

Wieso fallen beim Echo die Nachkommastellen alle weg, wenn sie oben noch ausgegeben werden?

Gibt es eine möglichkeit diese im echo auch noch auszugeben?

Der Teil des Skripts sieht folgendermaßen aus:

FOR /F "usebackq delims=!" %%i IN (`sqlplus -S %USER2%/%PW2%@%DB-NAME2% @%SQL2%`) DO set /a WERT2=%%i  
echo %WERT2%


Gruß

Hans

Content-Key: 244558

Url: https://administrator.de/contentid/244558

Printed on: April 20, 2024 at 04:04 o'clock

Member: narthan
Solution narthan Jul 24, 2014 updated at 09:09:28 (UTC)
Goto Top
Moin Hans,

lass das "/a" beim set-Befehl mal weg und füg noch Anführungszeichen ein. Also:

FOR /F "usebackq delims=!" %%i IN (`sqlplus -S %USER2%/%PW2%@%DB-NAME2% @%SQL2%`) DO set "WERT2=%%i"  
echo %WERT2%

Grüße, narthan
Member: Hans87
Hans87 Jul 24, 2014 at 09:11:14 (UTC)
Goto Top
Super, danke face-smile das Funktioniert schonmal...

jetzt noch eine weitere Frage:

ich Frage 2 Datenbanken ab, die mir beide einen solchen wert zurückgeben... Gibt es bei Batch die Möglichkeit diese dann zu addieren?
Member: narthan
narthan Jul 24, 2014 at 09:21:48 (UTC)
Goto Top
Hey

Zitat von @Hans87:

ich Frage 2 Datenbanken ab, die mir beide einen solchen wert zurückgeben... Gibt es bei Batch die Möglichkeit diese dann
zu addieren?

Also das Problem an Batch ist, dass es keine Funktion zur Berechnung von Komma-Werten besitzt. Daher werden bspw. bei Divisionen die Werte automatisch gerundet...
Da die Addition jedoch sehr simpel gestrickt ist, könntest du die jeweiligen Werte vor den Kommata sowie (jedoch in einer separaten Addition) die Werte nach den Kommata summieren und anschließend wieder zusammensetzen. Etwas aufwendig jedoch nicht schwierig ;)

Gruß, narthan
Member: Hans87
Hans87 Jul 24, 2014 at 09:28:24 (UTC)
Goto Top
würde bedeuten ich muss die 2 Werte erst in 2 verschiedenen Dateien speichern, dann jeweils die teile bis zum komma einlesen und addieren und dann die teile nach dem komma einlesen und addieren? und diese werte dann mit einem Komma getrennt wieder in eine datei schreiben?

Und was ist wenn die nachkommastellen folgendermaßen aussehen: 0.564 und 0.541 dann würde die Zahl ja größer werden, das ganze aber nicht zu der Zahl vor dem Komma addiert werden?


Gruß

Hans
Member: narthan
narthan Jul 24, 2014 at 09:44:21 (UTC)
Goto Top
Zitat von @Hans87:

würde bedeuten ich muss die 2 Werte erst in 2 verschiedenen Dateien speichern, dann jeweils die teile bis zum komma einlesen
und addieren und dann die teile nach dem komma einlesen und addieren? und diese werte dann mit einem Komma getrennt wieder in eine
datei schreiben?

Also in extra Dateien musst du gar nichts schreiben, dafür gibt es ja die tolle Möglichkeit, genügend Variablen anzulegen face-wink Wert vor dem Komma in eine Variable und Wert dahinter in eine neue. Und nach der Addition einfach eine echo-Zeile in der du die jeweiligen End-Variablen mit einem Komma dazwischen wieder zusammensetzt.


Und was ist wenn die nachkommastellen folgendermaßen aussehen: 0.564 und 0.541 dann würde die Zahl ja
größer werden, das ganze aber nicht zu der Zahl vor dem Komma addiert werden?

Diesbzgl. würde ich bei der Addition nicht direkt die Werte vor dem Komma, sondern erst die hinteren Stellen betrachten (also hier 564 und 541). Wenn die Summe bspw. größer als 999 ist (hier: 1105) könntest du festlegen, dass die erste Stelle (hier: 1) in eine neue Variable gespeichert wird, die übrigen Stellen ergeben das Ergebnis des Nachkomma-Werts.
Die neue Variable bei der Berechnung der Vorkomma-Werte mit einer if-Abfrage berücksichtigen und alles zusammen addieren.

Gruß, narthan
Member: AnkhMorpork
AnkhMorpork Jul 24, 2014 at 10:20:17 (UTC)
Goto Top
Hallo,

nimm die Powershell - sonst sitzt du nächstes Jahr noch dran.

Gruß
ANKH
Member: bastla
Solution bastla Jul 24, 2014 updated at 15:25:47 (UTC)
Goto Top
@ AnkhMorpork
Ich würde zwar auch nicht unbedingt zu Batch raten, aber so wild ist das dann auch wieder nicht (zumindest, wenn es nicht mehr als 8 Dezimalstellen zu verarbeiten gibt):
@echo off & setlocal
::Zeile 3 anpassen fuer die Ermittlung von WERT1 (ich habe beispielhaft %SQL1% verwendet)
FOR /F "usebackq delims=!" %%i IN (`sqlplus -S %USER2%/%PW2%@%DB-NAME2% @%SQL1%`) DO for /f "tokens=1-2 delims=." %%a in ("%%i") do set "WERT1_G=%%a" & set "WERT1_D=%%b00000000"   
set "WERT1_D=%WERT1_D:~,8%"  
FOR /F "usebackq delims=!" %%i IN (`sqlplus -S %USER2%/%PW2%@%DB-NAME2% @%SQL2%`) DO for /f "tokens=1-2 delims=." %%a in ("%%i") do set "WERT2_G=%%a" & set "WERT2_D=%%b00000000"  
set "WERT2_D=%WERT2_D:~,8%"  
set /a SUM_G=%WERT1_G%+%WERT2_G%
set /a SUM_D=1%WERT1_D%+1%WERT2_D%
set /a SUM_U=%SUM_D:~,1%-2
set /a SUM_G+=%SUM_U%
set "SUM=%SUM_G%.%SUM_D:~1%"  
echo Summe:%SUM%
Die (bei weniger als 8 Dezimalstellen in beiden Werten) am Ende angefügten Nullen sollten hoffentlich nicht weiter stören ...

Grüße
bastla

[Edit] Überzähliges "set" in Zeile 3 entfernt [/Edit]
Member: narthan
narthan Jul 24, 2014 updated at 11:37:40 (UTC)
Goto Top
Hey bastla!

( @Hans87 bessere Hilfe bei Batch Problemen als von bastla kannst du hier gar nicht bekommen)

In der 3.Zeile ist ein set zu viel face-wink Sonst ein top Code, hätte bei mir deutlich mehr Umfang gehabt (aufgrund zu wenig Know-how) face-big-smile

Zitat von @bastla:
@echo off & setlocal
::Zeile 3 anpassen fuer die Ermittlung von WERT1 (ich habe beispielhaft %SQL1% verwendet)
FOR /F "usebackq delims=!" %%i IN (`sqlplus -S %USER2%/%PW2%@%DB-NAME2% @%SQL1%`) DO for /f "tokens=1-2 delims=." %%a in ("%%i") do set set "WERT1_G=%%a" & set "WERT1_D=%%b00000000"   
set "WERT1_D=%WERT1_D:~,8%"   
Member: AnkhMorpork
AnkhMorpork Jul 24, 2014 at 11:39:58 (UTC)
Goto Top
Zitat von @bastla:

@ AnkhMorpork
Ich würde zwar auch nicht unbedingt zu Batch raten, aber so wild ist das dann auch wieder nicht (zumindest, wenn es nicht
mehr als 8 Dezimalstellen zu verarbeiten gibt):

Naja, wenn DU da am Machen bist ...

Aber ich denke, bis zum Rentenalter könnte ich das mit Batch auch hinbekommen.

Gruß

ANKH
Member: Hans87
Hans87 Jul 24, 2014 at 12:25:25 (UTC)
Goto Top
Hallo Bastla,

danke für deine Hilfe.. face-smile

kann es sein dass wen eine der Zahlen eine führende 0 hat, diese dann nicht addiert werden kann?

Gruß

Hans
Member: bastla
bastla Jul 24, 2014 updated at 15:27:47 (UTC)
Goto Top
Hallo Hans87!
wen eine der Zahlen eine führende 0 hat, diese dann nicht addiert werden kann?
Wenn dann auch noch danach 8 oder 9 kommt - ja (wird in diesem Fall als - ungültige - Oktalzahl interpretiert); allerdings sollte das nur die Ganzzahlen betreffen (bei den Dezimalanteilen habe ich eigentlich vorgesorgt).

Mit zB
:Loop
if "%WERT1_G%" neq "0" if "%WERT1_G:~,1%"=="0" set "WERT1_G=%WERT1_G:~1%" & goto :Loop  
könntest Du aber solche führenden Nullen entfernen ...

Grüße
bastla
Member: bastla
bastla Jul 24, 2014 updated at 15:27:10 (UTC)
Goto Top
Hallo narthan!

Danke für's genaue Lesen und für die Freundlichkeit (auch an ANKH). face-smile

Ich korrigiere das oben noch.

Grüße
bastla