Kako ću je onda napravit? Konverzija je na SS-u drugi red ispod messageboxa
C# - Problemi i rješenja
- poruka: 2.151
- |
- čitano: 703.885
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Onda ne radiš konverziju na dobar način. Nema drugog objašnjenja.
Da, "0.0001" se konvertira u 1 kao double.
ok, već je friday napisao.
Pa koja je poanta te metode kad ne radi kako treba? Double treba imati preciznost do 15 decimala a ne zaokruživati već na 4 ili 5.
Pa koja je poanta te metode kad ne radi kako treba? Double treba imati preciznost do 15 decimala a ne zaokruživati već na 4 ili 5.
Pa nije zaokruživanje ako "0.0001" pretvori u 1, ne?
Vjerojatno se radi o tome da string treba biti sa zarezom a ne sa točkom...
Meni treba da 0.0001 pretvori u 0.0001, kako i stoji u stringu a ne u 1 šta on radi!
Probava san i sa točkom i sa zarezom rezultat je isti...
Pa koja je poanta te metode kad ne radi kako treba? Double treba imati preciznost do 15 decimala a ne zaokruživati već na 4 ili 5.
Vjerojatno se radi o tome da string treba biti sa zarezom a ne sa točkom...
To ne bi smjelo biti tako jer onda bi taj program na jednom računalo se dobro izvodio a na drugom ne (u ovisnosti o tome što OS koristi - točku ili zarez).
Pa koja je poanta te metode kad ne radi kako treba? Double treba imati preciznost do 15 decimala a ne zaokruživati već na 4 ili 5.
Vjerojatno se radi o tome da string treba biti sa zarezom a ne sa točkom...
To ne bi smjelo biti tako jer onda bi taj program na jednom računalo se dobro izvodio a na drugom ne (u ovisnosti o tome što OS koristi - točku ili zarez).
Vjeruj mi, sa microsoft alatima je to kao dobar dan... Mogao bih ti takvih primjera istresti milijun!
Meni treba da 0.0001 pretvori u 0.0001, kako i stoji u stringu a ne u 1 šta on radi!
Probava san i sa točkom i sa zarezom rezultat je isti...
Malo je bedasto ali čini mi se da je ok (ako sam dobro shvatio šta trebaš)...
EDIT:
Ispravak, malo sam zakomplicirao
double broj1;
string broj1s;
broj1s = "0,00000001";
broj1 = Convert.ToDouble(broj1s);
textBox1.Text = broj1.ToString("N" + broj1s.Split(',')[1].Length);
A kako ću sad s tim napravit da mi program pritiskom na gumb dodaje znakove iza točke(0-9), da nije zadana vrijednost??
Baš me zaintrigiralo pa evo mog rješenja:
using System.Globalization;
double StringToDouble(String broj){
String decimalniSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
return Convert.ToDouble(broj.Replace(".", decimalniSeparator));
}
Primjer upotrebe funkcije:
double pom = StringToDouble("123.456");
MessageBox.Show(pom.ToString()); // 123,456 - na mom računalu
To ne bi smjelo biti tako jer onda bi taj program na jednom računalo se dobro izvodio a na drugom ne (u ovisnosti o tome što OS koristi - točku ili zarez).
Vjerojatno je program rađen u Visual Studiu koji "under the hood" pokupi neke propertyje iz okoline. Jedna od njih je i NumberFormat property. Naravno, property se može overwritati preko istoimene metode.
Ista stvar je i sa, recimo, vremenom, valutom, kalendarom (početak ned/pon), enkodingom, itd.
using System.Globalization;
using System.Threading;
(...)
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");
string broj = Console.ReadLine();
double doubleBroj = 0;
if (double.TryParse(broj, out doubleBroj))
doubleBroj = Math.Round(doubleBroj, 15);
Console.WriteLine(doubleBroj);
Console.ReadKey();
Baš me zaintrigiralo pa evo mog rješenja:
using System.Globalization;
double StringToDouble(String broj){
String decimalniSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
return Convert.ToDouble(broj.Replace(".", decimalniSeparator));
}
Primjer upotrebe funkcije:
double pom = StringToDouble("123.456");
MessageBox.Show(pom.ToString()); // 123,456 - na mom računalu
Napravio sam neki primitivni program da ovo isprobam i u njemu je radilo, večeras ću isprobati u kalkulatoru ali ne vidim zašto u njemu nebi radilo...
Pa koja je poanta te metode kad ne radi kako treba? Double treba imati preciznost do 15 decimala a ne zaokruživati već na 4 ili 5.
Vjerojatno se radi o tome da string treba biti sa zarezom a ne sa točkom...
To ne bi smjelo biti tako jer onda bi taj program na jednom računalo se dobro izvodio a na drugom ne (u ovisnosti o tome što OS koristi - točku ili zarez).
U stvari, taj sistem kultura koji se nalazi u .Net-u je dobro osmišljen i bazira se na jeziku i državi.
http://www.basicdatepicker.com/samples/cultureinfo.aspx
Ide se čak toliko detaljno da za jednu državu ima više jezika, npr. Švicarsku. Tim se dobija na fleksibilnosti, jer formati brojeva, datuma i valuta koji se unose u aplikaciju i iz nje izlaze kao outputi mogu biti različiti za istu aplikaciju, pa npr. njemac u ovakav kalkulator unosi europski format decimalnog broja, a amerikanac američki format decimalnog broja, a kao rezultat u outptu svatko dobija svoj format broja, a aplikacija ispravno radi neovisno o formatu inputa.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
double broj;
string brojS = Console.ReadLine();
double.TryParse(brojS, out broj);
Console.WriteLine(broj);
}
}
}
Dakle, ovaj program nije posebno odredio u kojoj kulturi će se izvršavati current tread. To u stvari znači da će kod izvođenja aplikacije .Net izvršavati aplikaciju u kulturi koja je podešena u cotrol panelu windowsa. Amerikanac ovdje u konzolu unosi američki format decimalnog broja, a njemac europski format, a kao ispis dobijaju svatko svoj format. I to je generalni koncept ovog sustava kultura, inputi se unose kao stringovi i parsiraju zavisno od kulture na koju je aplikacija podešena, bilo generalne iz control panela, bilo one određrene programom.
A problem može nastati jedino ako u okviru programa baratamo sa stringovima i onda ih parsiramo u brojeve.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
double broj;
string brojS = "125.225";
double.TryParse(brojS, out broj);
Console.WriteLine(broj);
}
}
}
Ovaj program gore mi ništa ne govori. Ne znam u kojoj kulturi radi current tread i kako će parsirati string u decimalni broj. Njemcu će dati 125225, a amerikancu 125.225.
Da bi se ovakve stvari izbjegle u programu treba se držati nekih pravila. Ako već parsiramo string varijable u programu, isto kao i što program radi sa double brojevima u američkom formatu, baš kao i C++, tako i mi trebamo pisati string koji predstavlja decimalni broj u američkom formatu, i još uz to parsiranje u double treba vršiti u treadu koji radi po američkim postavkama, a poslije konvertiranja vratiti tread u defaultne postavke.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Threading;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
double broj;
string brojS = "125.225";
CultureInfo defaultnaKultura = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
double.TryParse(brojS, out broj);
Thread.CurrentThread.CurrentCulture = defaultnaKultura;
Console.WriteLine(broj);
}
}
}
Dakle, kad čitamo ovaj string, čitamo ga kao i double varijablu u programu, a koja god kultura bila defaultna u programu, dobijamo točan rezultat, decimalan broj. Sad je potpuno svejedno po kojim se postavkama kulture u .Net-u vrti aplikacija. A glavna namjena ovog koncepta kultura u .Net-u je da se inputi unose i outputi dobijaju po formatima brojeva, datuma i valuta kako se gdje koriste.
Ajde sad malo da pričamo općenito nekim stvarima u C#-u, dosta vazda kako ovo, kako ono... :)
Evo mene zanima organizacija vašeg DAL sloja aplikacije. Znači na koji način radite sa bazom i koje patterne koristite (ako koristite). Ovo prvo, više-manje nebitno, više mi je bitna organizacija samog sloja, znači da li trpate sve u jednu klasu pa pišete metode za rad za bazom ili pravite neke repozitorije, recimo UsersRepository, ProductsRepository, ili na neki drugi načn.
Koristim uglavnom Entity Framework i ponekad LinqToSQL. Pomoću Entity Frameworka napravim model baze. Uz pomoć LinqToSQL queryiam bazu. Sve te CRUD operacije stavim u jednu klasu.
Ma to je ok za neke "manje" stvari, kad ta klasa krene rasti, to me zanima, prošla BLL klasa za CMS je imala 1k linija, a nije velik projekt, projekt koji upravu radim, već ih ima toliko, a nisam ni pri četvrtini rada. Pa me brine šta će se desiti kad to naraste do onih gabarita o kojima @Friday priča.
Ajde sad malo da pričamo općenito nekim stvarima u C#-u, dosta vazda kako ovo, kako ono... :)
Evo mene zanima organizacija vašeg DAL sloja aplikacije. Znači na koji način radite sa bazom i koje patterne koristite (ako koristite). Ovo prvo, više-manje nebitno, više mi je bitna organizacija samog sloja, znači da li trpate sve u jednu klasu pa pišete metode za rad za bazom ili pravite neke repozitorije, recimo UsersRepository, ProductsRepository, ili na neki drugi načn.
Dobri stari ADO.Net. Ručno pišem upite jer ugl. radim sa malim bazama (50ak tablica) i Entity me nije ni najmanje impresionirao na takvim malim stvarima. Imam jedan .dll koji mi obavlja sve CRUD operacije (za mssql, sqlite i access) i sastoji se od par klasa kojima jednostavno proslijedim string sa upitom.
Dobri stari ADO.Net. Ručno pišem upite jer ugl. radim sa malim bazama (50ak tablica) i Entity me nije ni najmanje impresionirao na takvim malim stvarima. Imam jedan .dll koji mi obavlja sve CRUD operacije (za mssql, sqlite i access) i sastoji se od par klasa kojima jednostavno proslijedim string sa upitom.
I ja sam na ADO.NET opet, slušao tebe. :) Kako misliš par klasa? Neki pattern?
Ma to je ok za neke "manje" stvari, kad ta klasa krene rasti, to me zanima, prošla BLL klasa za CMS je imala 1k linija, a nije velik projekt, projekt koji upravu radim, već ih ima toliko, a nisam ni pri četvrtini rada. Pa me brine šta će se desiti kad to naraste do onih gabarita o kojima @Friday priča.
Ja bih za to recimo napravio poseban Class Library.
Unutar njega klase za vece kolicine istih operacija.
I ja sam na ADO.NET opet, slušao tebe. :) Kako misliš par klasa? Neki pattern?
Jedan .dll (sa linkanim referancama za sqlite dll i u budućnosti, mysql)
Dakle:
dbHandler.dll - MSSQL (klasa) - ExecuteQuery(string query); return int ChangedRows
- GetData(string query); return DataTable Results_dt
- SetCon(string conn_string); (override druge klase, služi za spajanje na drugu bazu ili tako neš, van postavki)
- SQLite - Execute....
- GetData...
- SetCon....
I tako dalje.
Ja bih za to recimo napravio poseban Class Library.
Unutar njega klase za vece kolicine istih operacija.
Tako i radim naravno, dva projekta su za rad sa bazom. Nego da vidim kako ostatak ekipe radi.
@sum, zanimljivo rješenje, onda samo referenciraš dll i pičiš? To ću probati nekad kasnije, jer svakako imam prvi projekt koji je najniži, pa tek onda sloj bll-a, gdje su mi metode za ustaljene radnje nad tabelom. Sad ću smanjiti broj projekta za rad sa bazom na jedan, a neću morati pisati svaki put iznova isti kôd. Thanks! :)
Da, referenciram dll i deri. U tom .dllu ima još par copy/paste gluposti (error logger, XML reader, interna klasa za čitanje postavki za baze) i napravio sam ga samo zato da ne pišem jedno te isto X puta.
Evo, stigla je prva funkcionalna verzija mog digitrona, veliko hvala TracerCPP-u na pomoći pri konverziji podataka, ako neko hoće isprobat program ovde imate exe: http://www.filedropper.com/digitron (oko 85kb)
Samo mi još jedna stvar ne radi (estetska je tako da digitron i dalje funkcionaira) - ne mogu nikako "natjerati" program da učita font koji sam ja koristio pri izradi programa na windowsima na kojima taj font nije instaliran, googlanjem sam naišao na par rješenja koja ne rade, zna li ito slučajno kako to riješiti (imam file od tog fonta...)
Tio bi još i da svako dugme ima hotkey na tipkovnici ali to isto ne radi ://
Nakači keyPress evente...
Nakači keyPress evente...
Na to san bio naiša na googleu i ugradio u program ali nije radilo pa san ga odbacio, jeli možeš slučajno napraviti neki primitivni program za primjer da vidin kako se to ugrađiva?
Nakači keyPress evente...
Na to san bio naiša na googleu i ugradio u program ali nije radilo pa san ga odbacijo, jeli možeš slučajno napraviti neki primitivni program za primjer da vidin kako se to ugrađiva?
odbacijo, ugrađiva, tijo
Daj, ako već radiš kalkulator, onda si učio i gramatiku u školi.
-Poruka zastarila-
Evo kalkulator je dogurao do beta verzije (exe dostupan ovdje: http://www.filedropper.com/digitron_1 (oko 100kb download)), još samo fale hotkey-evi i ugrađivalje fonta i to će bit prva finalna verzija, evo jedan SS da vidite kako izgleda na sustavima gdje je instaliran ovaj font
Sve prijave bugova i komentari su dobrodošli.
Nema na čemu
Kako si to dobio?
(kad se dijeli s 0 pokaže se ta poruka ali se ne sruši program (bar meni) ali se sruši kad pokušaš pobrisati to što piše, uočeno, to je popravljeno i više ne dozvoljava djeljenje s 0, link u postu iznad