String in Nummer mit Nachkommastellen umwandeln
Hallo zusammen,
ich baue mir gerade einen Rechner zusammen.Hier möchte ich beliebige Text und Nummern reinkopieren und dann per replacex alle nicht numerischen Zeichen bis auf Umbrüche,Kommas und Punkte entfernen.
die übrig geblieben Zahlen möchte ich dann in einem Feld Summiert ausgeben. Das klappt auch soweit, allerdings nur für Ganzzahlen.
let text := Rechenfeld;
let rows := splitx(replacex(Rechnenfeld, "[^\d,.]", "\n"), "
");
let summe := 0;
for row in rows do
summe := summe + number(trim(row))
end;
summe
Bei Zahlen mit Nachkommastellen oder Punktnotierung wandelt number() diese leider nicht in Zahlen um. Habt ihr hier einen anderen Lösungsansatz?
Viele Grüße
Chris
4 Antworten
-
number() kann nur Text, der als ganze Zahl oder als punktnotierte Zahl dargestellt ist in eine Zahl umwandeln.
Beispiel:
number("1") ergibt 1
number("1.345") ergibt 1,345
Wenn du keine punktnotierte Zahl hast, sondern eine kommanotierte, musst du mit replace() das Komma in einen Punkt umwandeln.
Ich hänge mal ein Beispiel an:
let X := ["1,211", "2.322", "3.433"];
let Y := [0];
for i in range(0, cnt(X)) do
Y := array(Y, [number(replace(item(X, i), ",", "."))])
end;
debugValueInfo(sum(Y))
Die punktnotierten Zahlen werden einfach addiert. Die kommanotierte Zahl wird in eine punktnotierte Zahl umgewandelt.
-
Dein Beispiel könnte man wie folgt schreiben:
let text := Rechenfeld; let rows := rsort(splitx(replacex(Rechnenfeld, "[^\d,.]", "#"), "#")); let Y := [0]; for i in range(0, cnt(rows)) do Y := array(Y, [number(replace(item(rows, i), ",", "."))]) end; debugValueInfo(sum(Y))
-
Hi Uwe,
dank Dir für die schnelle Hilfe. Funktioniert so, habe nur noch eine mögliche Punktnotierung aufgelöst.
let text := Rechner; let rows := rsort(splitx(replacex(replace(Rechner, ".", ""), "[^\d,]", "#"), "#")); let Y := [0]; for i in range(0, cnt(rows)) do Y := array(Y, [number(replace(item(rows, i), ",", "."))]) end; sum(Y)
Danke!
-
Ich habe mal im Forum einen Script gefunden der aus einer Texteingabe und einfache Operationen ein Ergebnis bildet. Das habe ich an meine Bedürfnisse angepasst. Das Feld ‚Formel‘ ist die Texteingabe mit der Formel:
if Formel then
let myT := Formel;
let Flag := true;
while Flag = true do
let myAR := split(myT, "(");
for i in myAR do
if contains(i, ")") then
let my := substr(i, 0, index(i, ")"));
let res := round(getMParser(my), Rundung);
myT := replace(myT, "(" + my + ")", text(res))
end;
Flag := if contains(myT, "(") then true else false end
end
end
;
let myRes := kauffRund_var(getMParser(myT) * Faktor, Rundung);
myRes
endgetMPharser ist eine globale Formel aus dem Forum:
function getMParser(myArr : text) do
var myS := split(join(splitx(myArr, "[\d.,]+"), ""), "");
var myN := for i in splitx(replace(myArr, ",", "."), "[\*\/\+\-]") do
number(i)
end;
for i from 0 to cnt(myS) do
if item(myS, i) = "*" or item(myS, i) = "/" then
let my1 := item(myN, i);
let my2 := item(myN, i + 1);
let myE := switch item(myS, i) do
case "*":
my1 * my2
case "/":
my1 / my2
end;
myN := for k from 0 to cnt(myN) do
switch k do
case i:
0
case i + 1:
myE
default:
item(myN, k)
end
end
end
end;
myS := for j from 0 to cnt(myS) do
let myJ := item(myS, j - 1);
if item(myS, j) = "*" or item(myS, j) = "/" then
if myJ = "-" then "-" else "+" end
else
item(myS, j)
end
end;
var myER := first(myN);
for i from 0 to cnt(myS) do
myER := switch item(myS, i) do
case "+":
myER + item(myN, i + 1)
case "-":
myER - item(myN, i + 1)
end
end;
myER
endVielleicht hilft das ja als Idee wie man es auch gestalten kann.
Content aside
- Status Answered
- vor 2 JahrenZuletzt aktiv
- 4Antworten
- 273Ansichten
-
3
Folge bereits