Avatar
safix01
Člen
Avatar
safix01:30.12.2017 13:59

Ahoj, nevíte někdo, prosím, jak zakrouhlit hodnoty (na 3 deset.místa), které mi posílá posílá vzdálené zařízení.
Tato metoda ve tříde class čte hodnoty ze vzdáleného zařízení:
public string readValue(string value)
{
string result = readVar(Socket, value);
return result;
}

a pak ji volám v druhé třídě class.readValue();

Nevím přesně jakým vhodným způsobem to udělat, aby mi ta hodnota už chodila zaokrouhlená, jestli to udělat v té metodě nebo až pak kde ji volám? Díky za rady :)

 
Odpovědět 30.12.2017 13:59
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na safix01
Petr Stastny:30.12.2017 14:28

Jestli potřebuješ zaokrouhlit číslo v kódu, jde to udělat tak, že double (float, nebo co používáš) vynásobíš 1000 a zaokrouhlíš klasicky pomocí Math.Round, potom vydělíš 1000 a máš to.

double cislo = 12.345678d;
cislo *= 1000; // 12345.678
cislo = Math.Round(cislo); // 12346
cislo /= 1000d; //12.346

Nebo, když se ti nechce psát zbytečně kód, mělo by jít:

Math.Round(cislo, 3);
:)

Žádný z kódů jsem nezkoušel, může tam být chyba.

 
Nahoru Odpovědět 30.12.2017 14:28
Avatar
safix01
Člen
Avatar
Odpovídá na Petr Stastny
safix01:30.12.2017 14:50

Díky za reakci, ale problém je, že mě ta hodnota chodí ve stringu, takže to nelze takto použít.

 
Nahoru Odpovědět 30.12.2017 14:50
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na safix01
Petr Stastny:30.12.2017 15:07

A nemohl bys to přeparsovat?

string s = "123.456";
double d = double.Parse(s); // 123.456
 
Nahoru Odpovědět 30.12.2017 15:07
Avatar
safix01
Člen
Avatar
Odpovídá na Petr Stastny
safix01:30.12.2017 15:23

Já tu hodnotu potřebuju mít ve stringu, pac ta komunikace probíha pres tcp a ta hodnota je posílána jako řetězec:

public string readValue(string value)
{

string result = readVar(Socket, value);

double d = double.Parse(va­lue);
Math.Round(d, 3);
return result;
}
Takze myslis, ze takhle by to mohlo fungovat?

 
Nahoru Odpovědět 30.12.2017 15:23
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na safix01
Petr Stastny:30.12.2017 15:35

Jestli to chápu správně, tak to máš skoro dobře:

string result = readVar(Socket, value);

double d = double.Parse(result); // je v result to cislo ve stringu? Jestli jo, parsuj result
d = Math.Round(d, 3);
result = d.ToString();
return result;
 
Nahoru Odpovědět 30.12.2017 15:35
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na safix01
ostrozan:30.12.2017 15:49

pokud bys nechtěl zaokrouhlovat, ale stačilo by ti jen odstranit přebývající znaky tak můžeš použít

            string s = "12345.12345";
            string x = s.Remove(s.IndexOf('.') + 4);
//nebo
            string y = s.Substring(0, s.IndexOf('.') + 4);
//v obou pripadech bude vystup 12345.123
 
Nahoru Odpovědět 30.12.2017 15:49
Avatar
safix01
Člen
Avatar
safix01:30.12.2017 16:04

ostrozan: díky, pak vyzkousim.
petr: jde o to, ze v tom result je i ten Socket(coz zajistuje to tcp) a ja potrebuju zaokrouhlit jen to "value", kde je ta hodnota, tak nevím jestli to takhle bude fungovat, kdyz parsuju celý "result" ?

 
Nahoru Odpovědět 30.12.2017 16:04
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na safix01
Petr Stastny:30.12.2017 16:09

Nevím, co dostáváš v resultu, takže napíšu tohle:

string cislo = ...; // "123.456"

double d = double.Parse(cislo)
d = Math.Round(d, 3);
cislo = d.ToString();
return cislo;
 
Nahoru Odpovědět 30.12.2017 16:09
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na safix01
ostrozan:30.12.2017 16:15

Můžeš sem dát ukázku, co přesně obsahuje value z toho readVar(Socket, value); ?

 
Nahoru Odpovědět 30.12.2017 16:15
Avatar
safix01
Člen
Avatar
safix01:30.12.2017 16:28

Chápu, ted nemam moznost to vyzkouset, abych zjistil co vrací presne ten result.
Díky, pak dam vedet :)

 
Nahoru Odpovědět 30.12.2017 16:28
Avatar
safix01
Člen
Avatar
Odpovídá na ostrozan
safix01:30.12.2017 16:34

to value obsahuje řetezec, kterým volám příslusnou hodnotu, např.: "$Max_weight" ...atd

 
Nahoru Odpovědět 30.12.2017 16:34
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na safix01
Petr Stastny:30.12.2017 17:00

Použij ten poslední kód co jsem ti poslal. Zjisti si, co to vrací to číslo ve stringu a použij to, mělo by to fungovat.

 
Nahoru Odpovědět 30.12.2017 17:00
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na safix01
ostrozan:30.12.2017 18:32

Jak to tak vidím tak nejdřív asi budeš muset z toho stringu vypreparovat to číslo samotné - nejlépe za pomocí regulárního výrazu - řekl bych dokonce, že ti číslo vrátí v požadovaném tvaru - ovšem bude to opět jenom oříznuté -ne zaokrouhlené

 
Nahoru Odpovědět 30.12.2017 18:32
Avatar
ostrozan
Redaktor
Avatar
Avatar
safix01
Člen
Avatar
safix01:30.12.2017 18:51

tomu příkladu moc nerozumím:
takze ten tvuj kod string x = s.Remove(s.In­dexOf('.') + 4); fungovat nebude ?
Jak presne teda vypreparovat "value"?

 
Nahoru Odpovědět 30.12.2017 18:51
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na safix01
Petr Stastny:30.12.2017 20:15

Mohl bys nám prosím napsat přesně hodnoty všech proměnných? Máme v tom trochu zmatek.

EDIT: A rozhodni se, jestli chceš používat řešení moje (klasické zaokrouhlení), nebo ostrozana (usekne všechna desetinná místa až na tři). V určitých situacích ti bude každé řešení dávat jiný výsledek.

Editováno 30.12.2017 20:17
 
Nahoru Odpovědět 30.12.2017 20:15
Avatar
safix01
Člen
Avatar
safix01:30.12.2017 20:48

Zalezi jakym retezcem(instrukcí) je budu volat a ten dany retezec je presne v te promenne value a vypada vzdy takto "$Max_value" apod., tech prikazu je spousta...
Pokud jde o zpusob reseni, je mi to jedno, hlavne aby to fungovalo. I kdyz ten ostrazana mi přijde lepší v případě nějakých jiných nevhodných znaků, které se mohou vyskytnout na konci volaného řetězce.
Shrnu to jeste jednou: mam sadu nejakych instrukcí v tomto tvaru "$Max_value" , coz je ulozeno v promene "value", zalezi kterou vzdy zavolam, to se děje v jiné tride např. takto: readValue("$Max_va­lue") a to mi vrací tu mojí žádanou hodnotu, kterou potrebuji zaokrouhlit. Tak možná jestli to zaokrouhlování nepouzit az v te tride, kde ji volám?

 
Nahoru Odpovědět 30.12.2017 20:48
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na safix01
Petr Stastny:30.12.2017 21:52

Takže co vrátí readValue("$Max_va­lue")? Třeba "12.345"?

Ostrozanovo řešení je lepší v tom co říkáš, má ale nevýhodu, a to, že nezaokrouhluje, jenom odsekává poslední část, takže tam budou v 50 % případů malé odchylky. Můžeš si je dovolit, nebo to je jenom pro zvýšení čitelnosti a už s tím číslem dál nepracuješ? Ale ať už použiješ jakékoli řešení, potřebujeme přesnou ukázku toho, co dostaneš z toho zařízení.

 
Nahoru Odpovědět 30.12.2017 21:52
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na safix01
ostrozan:30.12.2017 22:10

Co tedy přesně vrací metoda readVar(Socket, value); ? nějaký string ve tvaru 12345.123456 - tedy textovou podobu floating point number?
nebo ještě i něco jiného - což vlasně připouštíš

případě nějakých jiných nevhodných znaků, které se mohou vyskytnout na konci volaného řetězce.

tady by ti pomohl ten regex - tady máš teda konkrétní příklad

Regex regex = new Regex(@"[-+]?([0-9]*\.[0-9]+|[0-9]+)");//vytahne pouze cislo s desetinnou teckou
Match match = regex.Match(readVar(Socket, value));
if (match.Success)
{
   double d = double.Parse(match.Value)
   d = Math.Round(d, 3);
   return d.ToString();
}

toto je dobré když chceš vyseparovat nějaký vzor z textu třeba z "hledané číslo je 123.45" ti vytáhne "123.45"

tvůj případ by se dal ošetřit i jednodušeji použitím TryParse místo Parse ale to by ti výsledek v případě chyby zahodilo, což asi nechceš

 
Nahoru Odpovědět 30.12.2017 22:10
Avatar
safix01
Člen
Avatar
safix01:30.12.2017 22:58

petr: ano, treba toto: -25.49212 a ty poslední 2 znaky zatím nevím co jsou, takže to oříznutí by bylo asi lepší řešení. Ale, počet desetinných míst se liší, záleží jakou hodnotu přesně volám. To, že nezaokrouhluju tolik nevadí, ta přesnost na 2 des.místa je dostačující, takže si to dovolit mohu(ano, lepsi pro zvyseni citelnosti).

ostrozan: ano presne tak, nekdy to muze vratit např i text: FALSE, ne jen číselne hodnoty..
Moc díky za příklad. V tom případě tohle řešení bude asi jediné z možných, protože to co volám to NE VŽDY vrací číslené hodnoty, ale jak jsem psal výše: i např. FALSE atd. a ještě za to ty zbytečné znaky .
Tak zkusím pak ten regex, slyším o tom úplně poprvé. Během příštího týdne to vyzkouším, jestli to bude fungovat. Díky :)

 
Nahoru Odpovědět 30.12.2017 22:58
Avatar
safix01
Člen
Avatar
safix01:30.12.2017 22:59

nenačetli se ty 2 znaky, tak posílám obrazek...

 
Nahoru Odpovědět 30.12.2017 22:59
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Petr Stastny
ostrozan:30.12.2017 23:05

ovšem profík by to napsal takhle

return  match.Success ? Math.Round(double.Parse(match.Value), 3).ToString():"neplatné číslo";
;-)
 
Nahoru Odpovědět 30.12.2017 23:05
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na ostrozan
Petr Stastny:31.12.2017 0:47

Pěkné :D Já tohle nedělám od doby, kdy jsem spojil asi 4 ternární výrazy, 6 linq querin a potom jsem to za půl roku potřeboval upravit :D

Ale v tomhle případě mi to přijde i přehlednější ten ternární výraz :)

Editováno 31.12.2017 0:49
 
Nahoru Odpovědět 31.12.2017 0:47
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Petr Stastny
ostrozan:31.12.2017 7:48

tak ono jako všude - i tady platí všeho s mírou nebo jak se někde říká vocaď pocaď :-)
ta moje ukázka je tak mez srozumitelnosti - dál už bych asi nešel

 
Nahoru Odpovědět 31.12.2017 7:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 25 zpráv z 25.