0

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

null
    • UweG
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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.
     

    • UweG
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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))
    
    • chris.3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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! 

    • Wegener & Hinz GmbH
    • green_cup
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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
    end

    getMPharser 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
    end

     

    Vielleicht hilft das ja als Idee wie man es auch gestalten kann.

Content aside

  • Status Answered
  • vor 1 JahrZuletzt aktiv
  • 4Antworten
  • 134Ansichten
  • 3 Folge bereits