Avatar billede mulse Nybegynder
14. november 2007 - 20:53 Der er 11 kommentarer og
1 løsning

omregning af string

Hej,
Jeg har en dropdown liste med følgende værdier:
1*45
2*45
3*45
ect...

Jeg vil gerne have disse værdier regnet om til en int:
int timespan = Convert.ToInt32(this.lessontime.SelectedItem.Text);
dette kan dog ikke lade sig gøre da convert funktionen kun godtager héltal. Er der ikke en metode jeg kan benytte til at caste dette uden at jeg skal ind og lave substrings?
Avatar billede Syska Mester
14. november 2007 - 20:58 #1
står der reelt 1*45 ?

da alle de tal er heltal ... så med mindre der står 2*45 hvilket giver 90 ...
Du kan så assign både (text/value) pair til en liste og så bind dem ...

Sådan du får 90 ud ved 2*45

Går ud fra teksten i din dropdown er 1*45 etc ... men værdien du vil have ud er 45, 90, 135 ?

// ouT
Avatar billede bizty Nybegynder
14. november 2007 - 21:03 #2
int timespan = CInt(this.lessontime.SelectedItem.Text.split("*")(0)) * CInt(this.lessontime.SelectedItem.Text.split("*")(1));

Tror jeg vil virke (er ikke sikker på om CInt-genvejen er tilgængelig i C#). Jeg kender ikke til nogen metode hvor du kan få et matematisk udtryk evalueret fra en streng.

Ellers har du også muligheden for at tilføje et objekt som value til hvert element. Det kunne være en struktur med to int felter..
Avatar billede Syska Mester
14. november 2007 - 21:04 #3
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            List<ClassA> list = new List<ClassA>();
            list.Add(new ClassA("1*45", 1 * 45));
            list.Add(new ClassA("2*45", 2 * 45));
            list.Add(new ClassA("3*45", 3 * 45));
            list.Add(new ClassA("4*45", 4 * 45));
            list.Add(new ClassA("5*45", 5 * 45));
            comboBox1.DataSource = list;
            comboBox1.DisplayMember = "Text";
            comboBox1.ValueMember = "Length";
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(comboBox1.SelectedValue.ToString());
        }
    }

    public struct ClassA
    {
        private string f_Text;

        public string Text
        {
            get { return f_Text; }
            set { f_Text = value; }
        }

        private int f_Length;
        public int Length
        {
            get { return f_Length; }
            set { f_Length = value; }
        }

        public ClassA(string text, int length)
        {
            f_Text = text;
            f_Length = length;
        }
    }

Det samme burde kunne gøre på en DropDownList hvis det er web ... hvilket jeg egentlig tror det er ... nu jeg læser dig spm igen ... men princip 100% det samme.

// ouT
Avatar billede Syska Mester
14. november 2007 - 21:06 #4
bizty:
Du mener vel en int og en string i hans object ... ellers vil der jo komme til at stå minut tal ... og ikke 2 * 45 .. eller har jeg misforstået hans spm.

// oUT
Avatar billede arne_v Ekspert
14. november 2007 - 21:06 #5
Muligheder:

1)  splitte op i tal '*' og tal, konvertere det to tal tilk int og udregne

    a)  IndexOf og Substring
    b)  regex

2)  bruge en generel expression evaluator

    a)  haandkod en
    b)  brug en JavaScript klasse med eval

Jeg er ret overbevist om at loesning 1b er den rette for dig.
Avatar billede mulse Nybegynder
14. november 2007 - 21:15 #6
Hey buzzzz, godt tænkt (kan sikkert bruges flere steder..) ;) smid et svar
arne_v: jeg er bare doven og vil undgå at lave substring og regex men ellers tak..
Avatar billede sherlock Nybegynder
14. november 2007 - 21:21 #7
http://www.palmbytes.de/content/dotnet/mathlib.htm

Med det kan du lave ting som:

        Evaluator evaluator = new Evaluator();
        Assert.IsNotNull(evaluator);
        Assert.AreEqual(10, Convert.ToInt32(evaluator.Eval("2*5")));
Avatar billede Syska Mester
15. november 2007 - 01:08 #8
svar ....

nice sherlock ... den vil jeg da gemme.

// ouT
Avatar billede sherlock Nybegynder
15. november 2007 - 02:35 #9
:)
Avatar billede arne_v Ekspert
15. november 2007 - 03:29 #10
Til den funktionalitet vil jeg kalde det overkill at hente det bibliotek.

Følgende meget lange og komplekse kode klarer det:

import System;

public class Evaluator {
    public function Eval(expr : String) : Double {
        return eval(expr);
    }
}
Avatar billede arne_v Ekspert
15. november 2007 - 03:31 #11
C:\>type Evaluator.js
import System;

public class Evaluator {
    public function Eval(expr : String) : Double {
        return eval(expr);
    }
}

C:\>type Test.cs
using System;

public class Test
{
    public static void Main(string[] args)
    {
        Evaluator ev = new Evaluator();
        Console.WriteLine(ev.Eval("2*5"));
    }
}

C:\>jsc /t:library Evaluator.js
Microsoft (R) JScript Compiler version 8.00.50727
for Microsoft (R) .NET Framework version 2.0.50727
Copyright (C) Microsoft Corporation 1996-2005. All rights reserved.


C:\>csc /r:Evaluator.dll /r:Microsoft.JScript.dll Test.cs
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.


C:\>Test
10
Avatar billede arne_v Ekspert
25. februar 2008 - 03:27 #12
Tid at få afsluttet her ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester