Diskuze: Tečky a čárky ve stringu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 25 zpráv z 25.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
pošli kód obsluhy těch tlačítek
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;
}
Jinak + - / x ještě nemám řešené
Ugh, to máš pro každé číslo zvlášť metodu?
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
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;
}
}
}
}
}
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
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)
Díky moc a 31 řádků kódu je pryč..
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?
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.
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.
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
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
Nebo myslíš že by slavný MICROSOFT udělal v dokumentaci chybu? Sakra oni to
vymysleli
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
Co má výstup společného s tím jak konvertuješ string na double?
Nic jen že v dokumentaci nic o E0 nepíšou.
A ty tam někde vidíš ToString? já ne já tam vidím ToDouble
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.
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
Já to tam vidím, když ani nevíš co píšeš, tak se ti těžko rádi. Gl.
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
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
Zobrazeno 25 zpráv z 25.