[ vampslayer @ 07.04.2011. 23:27 ] @
Izdvajanje realnog i imaginarnog dijela iz kompleksnog broja zapisanog kao string
Code:

  public Complex Vracanje_Complex(string s)
        {
            
            double r = Convert.ToDouble(s.Substring(0, s.LastIndexOf(" ")));
            
            int len = s.Length - (s.IndexOf("j") + 1);

            
            double i = Convert.ToDouble(s.Substring(s.IndexOf("j") + 1, len));

            return new Complex(r, i);
        }

problem je kad je imaginarni dio negativan(tj. vrati mi pozitivni dio)
Broj je u stringu s zapisan kao s="1.234 -j4.1234" (Ima razmak izmedju zadnje znamenke realnog dijela i operatora)

Kako da mi vrati img=-4.1234 a ne img=4.1234
[ lonelyrider_44 @ 08.04.2011. 00:41 ] @
Zašto ne pročitaš šta se nalazi ispred "j" ? Znači to bi bilo nešto ovako:
Code (csharp):

public Complex Vracanje_Complex(string s)
{
     double r = Convert.ToDouble(s.Substring(0,
     s.LastIndexOf(" ")));
     int len = s.Length - (s.IndexOf("j") + 1);
     double i = Convert.ToDouble(s.Substring(s.IndexOf("j") + 1, len));

     //provera da li je broj negativan
     if(s.Substring(s.IndexOf("j")-1,1)=="-")
          i = -i;

     return new Complex(r, i);
}
 

Ovo bi trebalo da ti radi posao, mada samo kada je kompleksan broj zadat u
strogo određenom formatu. Da bi se lepo parsirao string i kada su zapisani
drugačije, ili sa više razmaka (recimo prvo imaginaran deo, pa onda
realan), trebao bi da probaš da promeniš algoritam.

Evo jedne ideje: ako je uvek ovaj format stringa kao u primeru koji si
dao, zašto ne bi uzeo od celog stringa s="1.234 -j4.1234" ovaj deo:
"-j4.1234", i zatim izbaciš "j" i ostaje ti "-4.1234" i to onda proslediš
za konvertovanje u double. Tada nećeš imati problema sa znakom.
Usput, ne moraš koristiti Convert.ToDouble(string), imaš u klasi double
metodu Parse (double.Parse(string)).


--
Using Opera's revolutionary email client: http://www.opera.com/mail/
[ vampslayer @ 08.04.2011. 08:06 ] @
Hvala,da radi odlicno,string je vazda u tom formatu.
I sad pitanje,Zasto bi koristio double.Parse umjesto Convert.todouble??Brze se izvrsava ili sta vec??
[ lonelyrider_44 @ 08.04.2011. 10:05 ] @
Ne znam da se brže izvršava. double.Parse je osnovnija metoda za
konverziju stringa u double, moguće je da Convert.ToDouble kad se izvršava
ustvari poziva double.Parse pa vraća rezultat koji dobije, i ako je tako,
onda je double.Parse brža jer ima jedan poziv f-je manje. Ali to kod
današnjih računara ne pravi razliku. Spomenuo sam ti čisto informativno.
Koristi je ako je nađeš zgodnom, ako ne, i ovako je ok.
--
Using Opera's revolutionary email client: http://www.opera.com/mail/
[ w3bl0rd @ 08.04.2011. 11:00 ] @
Citat:

Ne znam da se brže izvršava. double.Parse je osnovnija metoda za
konverziju stringa u double, moguće je da Convert.ToDouble kad se izvršava
ustvari poziva double
.Parse pa vraća rezultat koji dobije, i ako je tako,
onda je double.Parse brža jer ima jedan poziv f-je manje. Ali to kod
današnjih računara ne pravi razliku. Spomenuo sam ti čisto informativno.
Koristi je ako je nađeš zgodnom, ako ne, i ovako je ok.


crveni text ti netreba ;)
Bolje je koristiti Decimal.Parse ili bilo koji drugi tip podatka.Parse od Convert.To...
[ Shadowed @ 08.04.2011. 11:22 ] @
Razlika je u tome sto Convert.ToDouble vraca nulu ako je string null umesto exception-a:
Code (csharp):

public static double ToDouble(string value)
{
    if (value == null)
        return 0.0;
    return double.Parse(value, CultureInfo.CurrentCulture);
}
[ lonelyrider_44 @ 08.04.2011. 11:58 ] @
A i taj expception može da se izbegne sa tipPodatka.TryParse, umesto tipPodatka.Parse .
Pritom, odmah se i hvata rezultat TryParse-a, tj. da li je uspelo ili ne, pa sam odlučuješ da li ćeš da postaviš neku defaultnu vrednost (0.0, recimo) ili da na zaustaviš program, itd..