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);
Synes godt om
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! :)
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.
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(" ","");
#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.
Synes godt om
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.
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.
Synes godt om
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..
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.
Synes godt om
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
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.
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 ? :)
double s = Convert.ToDouble(Row.PriceNvarchar); s = Math.Round(s, 2); var result = Regex.Replace(s.ToString(), @"(\.|\,)", m => m.NextMatch().Success ? "" : ".").Replace(" ","");
Synes godt om
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.
var s = Convert.ToDecimal(Row.PriceNvarchar); s = Math.Round(s, 2, MidpointRounding.ToEven); var result = Regex.Replace(s.ToString(), @"(\.|\,)", m => m.NextMatch().Success ? "" : ".").Replace(" ", "");
Det var præcis det jeg skrev som første svar til denne tråd..
Synes godt om
Slettet bruger
30. november 2012 - 13:06#36
Ikke helt, men næsten. Men du skal os ha tak for dit bidrag
Synes godt om
Ny brugerNybegynder
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.