[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

Eklis1412
Beiträge gesamt: 2

11. Mär 2016, 10:28
Beitrag # 1 von 10
Bewertung:
(3048 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

Hallo!
Ich habe folgendes Problem. "Mein" Skript funktioniert wunderbar bis zu den 4stelligen Zahlen, allerdings berücksichtigt er die 5 stelligen nicht mehr.
Die Preise sind mit einem Punkt getrennt. Also
1,-
10 ,-
100 ,-
1.000 ,-
10.000 ,-

Bei den 10.000 berechnet es nur die 10 und nicht den Rest sozusagen als Kommastelle.
Kommastellen kommen aber gar nicht vor. Die brauche ich eigentlich nicht.
Wie kann ich das lösen?

Zusätzlich wird der Punkt und da Komma nach der Berechnung nicht mehr angegeben. Das Ergebnis sieht dann also so aus:
1300- (anstatt 1.300,-)

Vielen Dank für Eure Hilfe?!

Hier das Skript:
Code
// BerechnungMitDialogUndRundung.jsx      

var myDoc = app.documents[0];
var myObj = (app.selection.length > 0 &&
(
(
app.selection[0].hasOwnProperty('baseline') &&
app.selection[0].constructor.name != 'InsertionPoint'
) ||
app.selection[0].constructor.name == 'TextFrame' ||
app.selection[0].constructor.name == 'Table' ||
app.selection[0].constructor.name == 'Cell'
)
)
? app.selection[0]
: app.activeDocument;
var theStyles = myDoc.characterStyles.everyItem().name; // Zeichenformate in Array
theStyles.shift(); // Abschneiden von Zeichenformat [Keine]

var theData = myDisplayDialog(); // Funktionsaufruf
var myFactor = theData.factor;
if (myFactor != undefined)
{
app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.appliedCharacterStyle = theData.style;
app.findGrepPreferences.findWhat = '\\d+[\\.,]?\\d*';
var myNumbers = myObj.findGrep();
app.findGrepPreferences = app.changeGrepPreferences = null;

for (oneNum = myNumbers.length-1; oneNum >= 0; oneNum--)
{
// Funktionsaufruf zu Berechnung und
// Zuweisung des neuen Inhats
if (isNaN(myNumbers[oneNum].contents.split(",").join(".") )){}
else
{
myNumbers[oneNum].contents = theCalculation(myNumbers[oneNum].contents, theData.round)
}
}
}

// Dialog
function myDisplayDialog()
{
var myFieldWidth = 80;

var myDialog = app.dialogs.add({name:"Berechnung"});
with(myDialog.dialogColumns.add())
{
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Faktor:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myFacTextEditbox = textEditboxes.add({editContents:"1,35", minWidth:140});
}
}
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Rundung:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myRoundTextEditbox = textEditboxes.add({editContents:"0", minWidth:140});
}
}
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Zeichenformat:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myStylesDropDown = dropdowns.add({stringList:theStyles, selectedIndex:0, minWidth:140});
}
}
}
var myResult = myDialog.show();
if(myResult == true)
{
var aFactor = myFacTextEditbox.editContents.split(",").join(".")*1;
var aStyle = theStyles[myStylesDropDown.selectedIndex];
var myRoundNum = Number(myRoundTextEditbox.editContents.split(",").join("."))
var aRound = (isNaN(myRoundNum) || myRoundNum == 0)
? 1
: 1/myRoundNum;
//Remove the dialog box from memory.
myDialog.destroy();
}
else
{
myDialog.destroy();
}
return {factor:aFactor, style:aStyle, round:aRound};
}

// Berechnungsfunktion
function theCalculation(theData, theRound){
var theOldNumber = theData.split(",").join(".") // Komma wird ggf. durch Punkt ersetzt
var theNewString = myRound(parseFloat(theOldNumber) * myFactor, theRound) ; // Berechnung der neuen Zahl
return theNewString;
}

function myRound(aNum, aDec)
{
var myResult = Math.round(aNum * aDec)/aDec;
if (aDec == 1)
return String(myResult);
if (myResult - Math.floor(myResult) == 0)
myResult += '.';
var myParts = String(myResult).split('.');
while (myParts[1].length < String(aDec).length-1)
{
myParts[1] += '0';
}
return myParts.join(',');
}


(Dieser Beitrag wurde von Gerald Singelmann am 11. Mär 2016, 11:25 geändert)
X

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

Hans Haesler
  
Beiträge gesamt: 5826

11. Mär 2016, 20:20
Beitrag # 2 von 10
Beitrag ID: #547973
Bewertung:
(2961 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Eklis,

herzlich willkommen in der Skriptwerkstatt auf HilfDirSelbst! :-)

Noch wurde keine Lösung Deines Problems gepostet. Das liegt hauptsächlich daran, dass nicht alles klar ist.

Stelle doch bitte ein Beispieldokument zur Verfügung. Mit einem Textrahmen im Zustand "vorher" und eine Kopie desselben Rahmens, mit dem gewünschten Ergebnis nach der Ausführung des Scripts.

Okay ... man könnte Deine Beispielzeilen kopieren, in einen Rahmen einsetzen und ihnen ein Zeichenformat zuweisen. Dann kann das Problem nachvollzogen werden.

Aber:
– Die Preise stehen nicht alleine in ihren Absätzen. Oder?
– Was ist mit den Leerschlägen vor den Kommas?
– Kommen auch Nachkommastellen vor?

Gruss, Hans


als Antwort auf: [#547955]

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

Eklis1412
Beiträge gesamt: 2

12. Mär 2016, 17:37
Beitrag # 3 von 10
Beitrag ID: #547979
Bewertung:
(2859 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans!
Hab inzwischen eine andere Lösung gefunden. Ich mach die Tausendertrennzeichen einfach mit GREP weg und dann kann ich die Zahlen berechnen. Da nach füg ich einfach den Punkt wieder ein.

Danke trotzdem für deine Tipps. Nächstes Mal werde ich es so machen.

Schöne Grüße Silke


als Antwort auf: [#547973]

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

Hans Haesler
  
Beiträge gesamt: 5826

13. Mär 2016, 00:42
Beitrag # 4 von 10
Beitrag ID: #547983
Bewertung:
(2808 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Silke!

bitte sehr. Gut, dass Du eine funktionierende Lösung gefunden hast.

Doch der eine oder andere Crack hätte sicher gerne präzise Angaben, um zu versuchen, das ursprüngliche Problem zu lösen.

Gruss, Hans


als Antwort auf: [#547979]

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

WernerPerplies
Beiträge gesamt: 2760

13. Mär 2016, 05:47
Beitrag # 5 von 10
Beitrag ID: #547985
Bewertung:
(2770 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

aus meiner Sicht die Problematik völlig klar, und die Antwort steht zum Beispiel hier:
Does JavaScript take local decimal separators into account?


als Antwort auf: [#547983]

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

Hans Haesler
  
Beiträge gesamt: 5826

13. Mär 2016, 08:28
Beitrag # 6 von 10
Beitrag ID: #547986
Bewertung:
(2727 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

danke für den Link zur interessanten Diskussion.

Doch um Silke brauchbar helfen zu können,
müsste man ein Beispieldokument haben.

Gruss, Hans


als Antwort auf: [#547985]

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

WernerPerplies
Beiträge gesamt: 2760

13. Mär 2016, 08:37
Beitrag # 7 von 10
Beitrag ID: #547987
Bewertung:
(2723 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen Hans,

Du hast auch gesehen, dass sich der Herr Singelmann bereits um das Problem gekümmert hat, oder?

Aber ich muss gerade feststellen, dass es trotzdem nicht funktioniert.

Im Suchergebnis müssen Tausenderpunkte gelöscht werden, das Dezimalkomma durch den Dezimalpunkt ersetzt werden, das Ergebnis muss dann wieder korrekt mit Tausenderpunkten und Dezimalkomma formatiert werden.



Gruß

Werner


als Antwort auf: [#547986]
(Dieser Beitrag wurde von WernerPerplies am 13. Mär 2016, 08:53 geändert)

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

WernerPerplies
Beiträge gesamt: 2760

13. Mär 2016, 09:02
Beitrag # 8 von 10
Beitrag ID: #547988
Bewertung:
(2705 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ach ja, und da steht z. B., wie es geht:
How can I format numbers as money in JavaScript?


als Antwort auf: [#547987]

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

Hans Haesler
  
Beiträge gesamt: 5826

13. Mär 2016, 09:27
Beitrag # 9 von 10
Beitrag ID: #547989
Bewertung:
(2673 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

ja, ich habe gesehen, dass der Herr Singelmann den Beitrag geändert hatte.

Aber sein Eingriff beschränkte sich vermutlich auf das Formatieren der Code-Zeilen als Code.

Gruss, Hans


als Antwort auf: [#547987]

Zahl multiplizieren mit Faktor berücksichtig die 10.000er Stellen nicht

WernerPerplies
Beiträge gesamt: 2760

13. Mär 2016, 10:00
Beitrag # 10 von 10
Beitrag ID: #547990
Bewertung:
(2640 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ja, da habe ich wohl zuviel hineininterpretiert.

Hier gibt es noch zwei Prototypen zur Konvertierung, - Quick and Dirty ohne Fehlerbehandlung zum Einbau in obiges Skript:

Code
 Number.prototype.formatGermanMoney = function(/*Int|Decimals*/c){ 
// basiert auf obigem Link
var n = this,
c = isNaN(c = Math.abs(c)) ? 2 : c,
d = ",",
t = ".",
s = n < 0 ? "-" : "",
i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "",
j = (j = i.length) > 3 ? j % 3 : 0;
return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
};
String.prototype.parseGermanMoney = function(){
var /*String*/s = this, /*RegEx*/regex = new RegExp (".", "g");
return parseFloat(s.replace(new RegExp ("\\.", "g"),"").replace(",","."));
};



als Antwort auf: [#547989]
X