NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Neaktivní uživatel:24.10.2017 17:38

Ahoj. Potřeboval bych poradit s jedním mým problémem. Jedná se o to že jsem si zkusil udělat jednoduchou kalkulačku jedná se o (viz. příloha) Mám 10 tlačítek s čísly + 1 s čárkou, všechny čísla fungují ale když zmáčknu kupříkladu 1 2 a čárku očekával bych tento výstup: 12, ale místo toho mi to udělá ,12 když poté zadám třeba nulu tak se to spraví, výstup: 12,0 je to tedy chyba stringu nebo mě :)

Odpovědět
24.10.2017 17:38
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Luboš Běhounek Satik:24.10.2017 17:42

pošli kód obsluhy těch tlačítek :)

Nahoru Odpovědět
24.10.2017 17:42
https://www.facebook.com/peasantsandcastles/
Avatar
Neaktivní uživatel:24.10.2017 17:53

Obsluha tečky/čárky:

private void PointBtn_Click(object sender, EventArgs e)
        {
            if (PointUsed == false)
            {
                PointUsed = true;
                Display = Display + ",";
                Update();
            }
        }

Obsluha Čísel:

private void NmbBtn9_Click(object sender, EventArgs e)
        {
            Display = Display + "9";
            Update();
        }

Update metoda:

private new void Update()
        {
            if (UR == true)
            {
                Display = Display.Remove(1);
                UR = false;
            }
            RsltTB.Text = Display;
        }
Nahoru Odpovědět
24.10.2017 17:53
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:24.10.2017 18:17

Jinak + - / x ještě nemám řešené :)

Nahoru Odpovědět
24.10.2017 18:17
Neaktivní uživatelský účet
Avatar
Luboš Běhounek Satik:24.10.2017 18:26

Ugh, to máš pro každé číslo zvlášť metodu? :D
Tu metodu stačí napsat jednou a číslici si můžeš uložit do button.Tag nebo i ji jen přečíst z Popisku tlačítka.

Názvy proměnných by taky mohly bejt lepší, RsltTB nebo UR nikomu nic neřeknou, neboj se to psát celým jménem.

Jinak tady jsem si nikde problému nevšiml

Nahoru Odpovědět
24.10.2017 18:26
https://www.facebook.com/peasantsandcastles/
Avatar
Neaktivní uživatel:24.10.2017 18:53

Já právě taky ne proto jsem sem přišel vůbec mně nenapadá kde by mohl být problém..

using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Kalkulačka
{
    public partial class Calculator : Form
    {
        bool Remove = false;
        bool PointUsed = false;
        string Display, _Display;
        Double Result = 0.0;
        public Calculator()
        {
            InitializeComponent();
        }
        private void Calculator_Load(object sender, EventArgs e)
        {
        }
        private void Add(string Char)
        {
            Display = Display + Char;
            Update();
        }
        private new void Update()
        {
            if (Remove == true)
            {
                Display = Display.Remove(1);
                Remove = false;
            }
            ResultTB.Text = Display;
        }
        private void NmbBtn0_Click(object sender, EventArgs e)
        {
            if (Display.Length != 0)
            {
                Add("0");
            }
        }
        private void NmbBtn1_Click(object sender, EventArgs e)
        {
            Add("1");
        }
        private void NmbBtn2_Click(object sender, EventArgs e)
        {
            Add("2");
        }
        private void NmbBtn3_Click(object sender, EventArgs e)
        {
            Add("3");
        }
        private void NmbBtn4_Click(object sender, EventArgs e)
        {
            Add("4");
        }
        private void NmbBtn5_Click(object sender, EventArgs e)
        {
            Add("5");
        }
        private void NmbBtn6_Click(object sender, EventArgs e)
        {
            Add("6");
        }
        private void NmbBtn7_Click(object sender, EventArgs e)
        {
            Add("7");
        }
        private void NmbBtn8_Click(object sender, EventArgs e)
        {
            Add("8");
        }
        private void NmbBtn9_Click(object sender, EventArgs e)
        {
            Add("9");
        }
        private void PointBtn_Click(object sender, EventArgs e)
        {
            if (PointUsed == false)
            {
                PointUsed = true;
                Add(",");
            }
        }
        private void RemoveBtn_Click(object sender, EventArgs e)
        {
            if (Display.Length != 0)
            {
                Display = Display.Remove(Display.Length - 1);
                Update();
                if (Display.Length == 0)
                {
                    Display = "0";
                    Update();
                    Remove = true;
                }
            }
        }
    }
}
Editováno 24.10.2017 18:54
Nahoru Odpovědět
24.10.2017 18:53
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:24.10.2017 19:16

Jinak díky za radu.. To UR jsem dělal včera a když jsi mě na to dneska upozornil tak jsem 5 minut přemýšlel nad tím co jsem tím měl na mysli :D

Nahoru Odpovědět
24.10.2017 19:16
Neaktivní uživatelský účet
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Ondřej Štorc:24.10.2017 20:25

Tenhle kód vypadá OK, ted co se týče funkčnosti.
Furt tam máš spoustu duplicitního kódu, šlo by to udělat mnohem jednodušeji

private void NmbBtnAdd_Click(object sender, EventArgs e)
{
    string value = (sender as Button).Tag.ToString();
    Add(value);
}

A na tuto metodu navážeš všechny buttony (v designeru si ji budeš moct vybrat), dál ještě musíš nastavit všem buttonům vlastnost tag na tu jejich hodnotu (taky v designeru)

Nahoru Odpovědět
24.10.2017 20:25
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Neaktivní uživatel:25.10.2017 17:54

Díky moc a 31 řádků kódu je pryč.. :)

Nahoru Odpovědět
25.10.2017 17:54
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:29.10.2017 20:07
private void OperationBtnController_Click(object sender, EventArgs e)
        {
            string value = (sender as Button).Tag.ToString();
            _Display = Display;
            Display = "";
            switch (value)
            {
                case "+":
                    Command = "+";
                    break;
                case "-":
                    Command = "-";
                    break;
                case "/":
                    Command = "/";
                    break;
                case "*":
                    Command = "*";
                    break;
                case "=":
                    Display = Display + ".0";
                    _Display = _Display + ".0";
                    switch (Command)
                    {
                        case "+":
                            Result = Convert.ToDouble(Display) + Convert.ToDouble(_Display);
                            break;
                        case "-":
                            Result = Convert.ToDouble(Display) - Convert.ToDouble(_Display);
                            break;
                        case "/":
                            Result = Convert.ToDouble(Display) / Convert.ToDouble(_Display);
                            break;
                        case "*":
                            Result = Convert.ToDouble(Display) * Convert.ToDouble(_Display);
                            break;
                    }
                    ResultTB.Text = Result.ToString();
                    break;
            }
        }

Nějak mi to nefunguje prý to nemá správný vstupní formát nevíte co s tím?

Nahoru Odpovědět
29.10.2017 20:07
Neaktivní uživatelský účet
Avatar
vkvkvk
Člen
Avatar
Odpovídá na Neaktivní uživatel
vkvkvk:30.10.2017 18:25

Problém bude v tom, že se metoda chová jinak než je uvedeno v dokumentaci https://docs.microsoft.com/…ert.todouble?…
Vyžaduje, aby na konci čísla bylo "E0" nebo jiné číslo. Doporučuji si pustit ukázkový kód.
Zkoušel jsem ve verzích 3.5 a 4.5.

 
Nahoru Odpovědět
30.10.2017 18:25
Avatar
plelovsky
Člen
Avatar
Odpovídá na Neaktivní uživatel
plelovsky:30.10.2017 22:56

Problém je na řádcích

Display = Display + ".0";
_Display = _Display + ".0";

Zřejmě máš nastavené národní prostředí, kde je oddělovač desetinných míst čárka. S tou tečkou to pak nefunguje. To přidání ".0" tam vůbec nemusí být. Navíc když hodnota už oddělovač obsahuje, tak tam tyto řádky přidají druhý oddělovač a konverze na double skončí chybou.
BTW Display nastavuješ vždy na prázdný string, takže po konverzi na double bude hodnota 0 a ty výpočty nedopadnou tak jak by měly.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
30.10.2017 22:56
Avatar
Odpovídá na plelovsky
Neaktivní uživatel:1.11.2017 16:51

Promiň nějak tě nechápu. Display sice nastavuji na "" ale dám do něj čísla výpočty udělám až po stisku = . Já vím čím blbějšího uživatele očekávám tím lepší to bude, pro mě je hlavní zprovoznit ten systém výpočtů potom až poté tam budu dávat vychytávky :)

Nahoru Odpovědět
1.11.2017 16:51
Neaktivní uživatelský účet
Avatar
Odpovídá na vkvkvk
Neaktivní uživatel:1.11.2017 17:54

Taky tě nechápu, na microsoftu je jasně napsaný ukázkový kód.. Při převodu

Convert.ToDouble("190.34001")

Je výstup 190.34001 a nějaké E0 tam nikde nevidím :D
Nebo myslíš že by slavný MICROSOFT udělal v dokumentaci chybu? Sakra oni to vymysleli :D

Editováno 1.11.2017 17:56
Nahoru Odpovědět
1.11.2017 17:54
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:1.11.2017 18:01

Zkoušel jsem to nefunguje to :) K těm čárkám opravil jsem si to a nefunguje to, nefunguje to i když nepoužívám desetinný čísla vůbec :D

Nahoru Odpovědět
1.11.2017 18:01
Neaktivní uživatelský účet
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:1.11.2017 20:28

Co má výstup společného s tím jak konvertuješ string na double?

 
Nahoru Odpovědět
1.11.2017 20:28
Avatar
Odpovídá na Jan Vargovský
Neaktivní uživatel:2.11.2017 15:13

Nic jen že v dokumentaci nic o E0 nepíšou.

Nahoru Odpovědět
2.11.2017 15:13
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:2.11.2017 17:24

A ty tam někde vidíš ToString? já ne já tam vidím ToDouble :D

Nahoru Odpovědět
2.11.2017 17:24
Neaktivní uživatelský účet
Avatar
HONZ4
Člen
Avatar
Odpovídá na Neaktivní uživatel
HONZ4:2.11.2017 19:23

Nefunguje to, protože je celý ten kód k ničemu. Navíc vůbec neošetřuješ chyby.

string value = (sender as Button).Tag.ToString();
_Display = Display; //tady přiřadíš hodnotu Display do _Display
Display = ""; //tady Display vymažeš
switch (value)
{
    case "+":
        Command = "+";
        break;
    case "-":
        Command = "-";
        break;
    case "/":
        Command = "/";
        break;
    case "*":
        Command = "*";
        break;
    case "=":
        Display = Display + ".0"; //tady k vymazané hodnotě Display přidáš .0
        //když už, tak např: Display = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator + "0";
        _Display = _Display + ".0"; //tady k hodnotě _Display přidáš _Display a .0
        switch (Command)
        {
            case "+":
                Result = Convert.ToDouble(Display) + Convert.ToDouble(_Display);
                //tady vždy konvertuješ .0 na double a přičteš (_Display)
                break;
         ....
        }
        ResultTB.Text = Result.ToString();
        break;

Měl by ses nejprve podívat na nějaké základy. A přemýšlet nad tím jak se kód bude vykonávat.

 
Nahoru Odpovědět
2.11.2017 19:23
Avatar
Neaktivní uživatel:2.11.2017 19:37

Teď se mi chce brečet... 1. Já jsem ty první 2 řádky smazal (zatím) 2. Já vždy zadám číslo + další číslo potom stisknu = a proběhne výpočet nikde tam není žádné konvertování .0 na double když místo toho zadávám nějaké číslo :D

Nahoru Odpovědět
2.11.2017 19:37
Neaktivní uživatelský účet
Avatar
HONZ4
Člen
Avatar
Odpovídá na Neaktivní uživatel
HONZ4:2.11.2017 19:51
  1. Měl bys tu dávat celý kód, ať nikdo nemusí věštit. Navíc ten kód co jsi tu dal je tak nesmyslný, že těžko může kdokoliv dedukovat co tím chtěl pachatel říct.
  2. Používej krokování.
 
Nahoru Odpovědět
2.11.2017 19:51
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:2.11.2017 21:24

Já to tam vidím, když ani nevíš co píšeš, tak se ti těžko rádi. Gl.

 
Nahoru Odpovědět
2.11.2017 21:24
Avatar
Neaktivní uživatel:3.11.2017 14:45

Mě to moc mrzí ale na mě se musí pomalu nejsem žádnej profík jako většina z vás takže výrazy jako "krokováni" neznám... Pardon máš pravdu opravdu to tam je.. Já se zapomněl podívat do přetížení pro tu metodu.. Moc se omlouvám :)

Nahoru Odpovědět
3.11.2017 14:45
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:6.11.2017 18:59

Vyřešeno.. Bylo to opravdu mazáním hodnoty Display, řešení problému mi řekl můj kámoš ale jelikož správné řešení mnohem dříve řekl už plelovsky ale já ho jen špatně pochopil tak dávám správné řešení jemu :)

Nahoru Odpovědět
6.11.2017 18:59
Neaktivní uživatelský účet
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.