Avatar billede Slettet bruger
29. november 2012 - 11:03 Der er 35 kommentarer og
1 løsning

round en float

Hvordan laver jeg en round på en float?

Jeg har denne her kode:

Row.Price = float.Parse(result);

Denne giver mig fx 12.2412523949 i min database

Men jeg vil gerne round den så den kun giver mig 12.24 fx !!

HOW? :D

tak for hjælpen!
Avatar billede Panen Nybegynder
29. november 2012 - 11:26 #1
Det nemmeste er at parse dit result som decimal :)

Row.Price = decimal.Parse(result);
decimal afrundet = Math.Round(Row.Price, 2);
Avatar billede Panen Nybegynder
29. november 2012 - 11:28 #2
Eller hvis Row.Price kræver float kan du gøre sådan her.

Row.Price = (float)Math.Round(decimal.Parse(result), 2);
Avatar billede Panen Nybegynder
29. november 2012 - 11:31 #3
Sorry for så mange posts (ville ønske jeg kunne edit).

Men hvis ovenstående ikke virker:

Row.Price = (float)Math.Round((decimal)result, 2);
Avatar billede ntholm Nybegynder
29. november 2012 - 11:32 #4
Hvis du converter til en int, rounder den til det nærmeste hele tal:

float myFloat = 12.98763853F;
int rounded = Convert.ToInt32(myFloat);


Hvis du altid vil rounde op, kunne du også gøre sådan her:

float myFloat = 12.28763853F;
int roundedUp = (int)Math.Ceiling(myFloat);

Håber det hjælper ;-)
Avatar billede Slettet bruger
29. november 2012 - 11:36 #5
Row.Price = (float)Math.Round(decimal.Parse(result), 2);

Den her var os mit eget bud - Men den virker desværre ikke, da den smider det ud som en float igen!

Så kommer der 100 decimaller bagpå igen
Avatar billede Slettet bruger
29. november 2012 - 11:37 #6
Kan du vise det med mit eksempel? Jeg er rimelig noob til C# :D
Avatar billede Slettet bruger
29. november 2012 - 11:40 #7
ntholm! kan du vise med mit eget ekspeml? Jeg forstår ikke helt dit - Jeg er rimelig ringe til C#!!
Avatar billede Slettet bruger
29. november 2012 - 11:41 #8
her er hele min kodehvis det giver mere mening:


        var s = Row.PriceNvarchar;
        var result = Regex.Replace(s, @"(\.|\,)", m => m.NextMatch().Success ? "" : ".").Replace(" ","");

       

        Row.Price = (float)Math.Round(decimal.Parse(result),2);
Avatar billede Panen Nybegynder
29. november 2012 - 11:45 #9
Faktisk er den mest korrekte løsning i min verden at du beholder den korrekte float med alle decimale i din Row.Price.

Når du så udskriver Row.Price forskellige steder i dit system, kan du vælge at udskrive med 2 decimaler. På den måde beholder du den præcise værdi.

For eksempel: MessageBox.Show(Row.Price.ToString("F"));

ToString("F"); // Udskriver 2 decimaler
Avatar billede ntholm Nybegynder
29. november 2012 - 11:51 #10
Det kan godt være lidt svært, at hjælpe dig ud fra de 2 linjer der. Jeg kender jo ikke sammenhængen og dit projekt ;-) Er det et gridview du roder rundt i? de første 2 linjer forstår jeg ikke uden for sammenhængen.

Hvad er s?

Hvis result er din float, så prøv at skriv den sidste linje sådan her:
Row.Price = (int)Math.Ceiling(result);
Avatar billede Slettet bruger
29. november 2012 - 11:52 #11
Min endestations tabel i min database er en float - Den må kun være float. intet må laves til string! :)
Avatar billede Panen Nybegynder
29. november 2012 - 11:54 #12
Og hvorfor må din database ikke indeholde floats med flere decimaler? :)

Det er vidst rimelig dårlig skik at rounde floats generelt, da tallet kan blive upræcist. Umiddelbart burde du gemme de korrekte værdier i din database, og alle der benytter dem derfra selv vise med 2 decimaler hvis nødvendigt.
Avatar billede ntholm Nybegynder
29. november 2012 - 12:01 #13
Panen har ret, man bør bevare det som float, hvis det er hvad det er.

Ud fra denne kode, så er det en Nvarchar du prøver at rounde, så er det klart det ikke virker..

prøv sådan her:
double s = Convert.ToDouble(Row.PriceNvarchar);
s = Math.Ceiling(s);
var result = Regex.Replace(s, @"(\.|\,)", m => m.NextMatch().Success ? "" : ".").Replace(" ","");
Avatar billede lclemens Nybegynder
29. november 2012 - 12:23 #14
Avatar billede Slettet bruger
29. november 2012 - 12:23 #15
Jeg vil rounde fordi den summer pænere op så :) alt efter 2 decimaler er jo usikkerheden.

Tallene indeholder kun 2 decimaller - resten der er bagved er usikre decimaler den har sat ind. Derfor vil jeg have den kun indeholder 2 decimaller :)

Jeg ved godt jeg kuunne gøre det anderledes i slutenden, men det var også bare et nice 2 have hvis det kunne lade sig gøre :D
Avatar billede Slettet bruger
29. november 2012 - 12:28 #16
virker desværre ikke :/
Avatar billede michael_stim Ekspert
29. november 2012 - 12:59 #17
#16
Nu må du lige hjælpe til her. "virker desværre ikke :/"

Hvad virker ikke?
Hvad gør den (ikke)?
Hvordan ser din kode ud som ikke virker?
Osv osv.
Avatar billede Slettet bruger
29. november 2012 - 13:09 #18
ja beklager!! :)

Den her kode siger:

double s = Convert.ToDouble(Row.PriceNvarchar);
s = Math.Ceiling(s);
var result = Regex.Replace(s, @"(\.|\,)", m => m.NextMatch().Success ? "" : ".").Replace(" ","");

Fejlen er:
Error    1    The best overloaded method match for 'System.Text.RegularExpressions.Regex.Replace(string, string, string)' has some invalid arguments   

og

Error    2    Argument '1': cannot convert from 'double' to 'string'

og
Error    3    Argument '3': cannot convert from 'lambda expression' to 'string'   


Mine string(row.pricenvarchar) er allerede i 2 decimaller når jeg henter de fra min tabel.

Det jeg vil er så at replace nogle , og .

Dernæst vil jeg have den ind i en ny tabel, hvor Price er defineret som en float.

Desværre smider min kode fint nok en float ud. Men den sættert også en masse usikre decimaler bagpå, hvilket jeg ikke vil have.
Avatar billede ntholm Nybegynder
29. november 2012 - 14:25 #19
Det er også en underlig måde at gøre det på - først at loade al dataen ind, og så bagefter replace en value i en row.

Du bør ændre værdien i din collection, inden du binder det til dit view/tabel/whatever.

For at fixe de errors du får, ville jeg prøve med:

double s = Convert.ToDouble(Row.PriceNvarchar);
s = Math.Ceiling(s);
var result = Regex.Replace(s.ToString(), @"(\.|\,)", m => m.NextMatch().Success ? "" : ".").Replace(" ","");

Men jeg vil sige at din approach er lidt underlig.. Kan vi ikke få lov til at se din database og dit view. Så er det lettere at finde en helhedsorienteret løsning.
Avatar billede Slettet bruger
29. november 2012 - 14:36 #20
grunden til at dataene er loadet ind, er fordi de kommer fra en anden server, hvor dataene derefter skal renses. Dvs. de kommer ind i en form som er en nvarchar, men de skal renes over i en ny tabel hvor det bliver til en float. For at lave stringen om til en float skal jeg replace nogle . og , - derefter ændrer jeg prisen til en float. Dette er den eneste måde det desværre kan gøres på, uden at belaste eller updatere tabellen. Insert er meget hurtigere nemlig..

Jeg kan desværre ikke vise noget til dig :)
Avatar billede ntholm Nybegynder
29. november 2012 - 14:47 #21
Jo der er.

Du laver en DTO class som har de samme properties i som den rigtige type.. Så Price er en float. I contructoren på denne class, ændrer du den string til en float.

Når du så sender din query til den externe collection, instantierer du samtidigt alle objekterne som denne DTOclass.. og så viser du dem i din collectin.
Avatar billede Slettet bruger
29. november 2012 - 14:51 #22
det fattede jeg intet af!! :D

Jeg bruger kun C# til at replace med, resten er SQL og task i integration services
Avatar billede ntholm Nybegynder
29. november 2012 - 15:06 #23
Hvis vi nu leger at det er biler du henter fra den externe server. Så laver du en class der ser sådan her ud (det er bare en almindelig .cs class): DTO står for Data Transfer Object.

public class BilDTO
{
    public double Price { get; set; }
    // her skriver du også alle andre properties

    public BilDTO(string p)
    {
        this.Price = float.Parse(p);
        // her indsætter du også alle andre properties
    }
}

Hent så alle objekterne fra den externe server til en collection.

List<Bil> list1= "Select * from Collection as Bil"

Så laver du alle bilerne om til DTO objekter i en ny liste.

List<BilDTO> list2 = new List<BilDTO>();
foreach(Bil b in list1)
{
    BilDTO dto = b;
    list2.Add(b);
}

Til sidst binder du list2 til dit view, f.eks gridview.

GridView1.DataSource = list2;
GridView1.Databind();
Avatar billede Slettet bruger
30. november 2012 - 09:14 #24
double s = Convert.ToDouble(Row.PriceNvarchar);
s = Math.Ceiling(s);
var result = Regex.Replace(s.ToString(), @"(\.|\,)", m => m.NextMatch().Success ? "" : ".").Replace(" ","");

det ovenstående der virker rent faktisk, men nu skærer den samtlige decimaler af ! :D Kan man så sætte 2 på igen ? eller gøre så den ikke gør ? :)
Avatar billede ntholm Nybegynder
30. november 2012 - 11:24 #25
Du sagde du at den skulle runde det op til et helt tal.. ;)

Men brug så panens metode, hvor den afrunder med 2 decimaler - istedet for Math.Ceiling
Avatar billede Slettet bruger
30. november 2012 - 11:30 #26
Men det gør den netop ikke med hans kode! :/ Det er lidt træs! Der smider den stadig x antal decimaler på :D

Men det er nok bare ikke ment to be!!

Og hvis jeg har sagt det, så har jeg skrevet forkert! :D For det var ikke det jeg mente!
Avatar billede ntholm Nybegynder
30. november 2012 - 11:36 #27
Som sagt - er det er finurlig måde du griber det hele an på.

Når det bliver printet til skærm - så bliver alle typer konverteret til strings - ALT.

Så du skal runde floaten af, convertere til string, inden du spytter det ud i viewet i første omgang - så slipper du for alle de "type" problemer.
Avatar billede ntholm Nybegynder
30. november 2012 - 11:37 #28
Avatar billede ntholm Nybegynder
30. november 2012 - 11:39 #29
double s = Convert.ToDouble(Row.PriceNvarchar);
s = Math.Round(s, 2);
var result = Regex.Replace(s.ToString(), @"(\.|\,)", m => m.NextMatch().Success ? "" : ".").Replace(" ","");
Avatar billede Slettet bruger
30. november 2012 - 11:47 #30
Problemet er bare at min dataviwer, viser min pris med 2 decimaller, men når den smider det ud i endedestionationen så sætter den de resterende på, som er en usikkerhed.

Så koden er i og for sig jo rigtig nok
Avatar billede ntholm Nybegynder
30. november 2012 - 11:51 #31
Så skal du vel "bare" sætte dit view til kun at vise den float den får som string - uden at gøre noget med den?
Avatar billede Slettet bruger
30. november 2012 - 12:19 #32
Lig lige et svar! jeg har løst det. Lavede min tabels kolonne om til en decimal :)  og så med din kode virkede det :)
Avatar billede ntholm Nybegynder
30. november 2012 - 12:21 #33
Svar. Glad for at kunne hjælpe ;)
Avatar billede Slettet bruger
30. november 2012 - 12:26 #34
Koden der hjalp;

var s = Convert.ToDecimal(Row.PriceNvarchar);             
        s = Math.Round(s, 2, MidpointRounding.ToEven);
        var result = Regex.Replace(s.ToString(), @"(\.|\,)", m => m.NextMatch().Success ? "" : ".").Replace(" ", "");
     
     

        Row.Price = Decimal.Parse(result);

Tak til ntholm
Avatar billede Panen Nybegynder
30. november 2012 - 13:03 #35
Det var præcis det jeg skrev som første svar til denne tråd..
Avatar billede Slettet bruger
30. november 2012 - 13:06 #36
Ikke helt, men næsten. Men du skal os ha tak for dit bidrag
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester