some1 Δημοσ. 6 Φεβρουαρίου 2013 Δημοσ. 6 Φεβρουαρίου 2013 Καλησπέρα σας. Χρειάζεται να κάνω την εξής τροποποίηση σε έναν κώδικα και επιθυμώ την βοήθεια σας. Τραβάω από κάπου κάποια ποσά με την εξής ιδιαιτερότητα. Άλλες φορές έχουν ως: σημείο για τις χιλιάδες την τελεία "." και για δεκαδικά το κόμμα "," (όπως το Ελληνικό σύστημα) και άλλες το ανάποδο, τελεία για τα δεκαδικά και κόμμα στις χιλιάδες (Αμερικάνικο σύστημα)Θέλω αυτά τα ποσά να μετατρέπονται στο Αμερικάνικο σύστημα (τελεία για δεκαδικά) και χωρίς κανένα σημείο στίξης στις χιλιάδες.Δηλαδήsum1 = 2.056,14 -> 2056.14και αντίστοιχαsum2 = 3,567.90 -> 3567.90Μπορεί το παραπάνω να γίνει εύκολα σε μια-δυό γραμμές με κάποιο regex, ίσως? Τα ποσά δεν ξεπερνούν το 9.999,99 δηλαδή πάντα μέχρι 2 δεκαδικά ψηφία και μονοψήφια χιλιάδα (εάν η υλοποίηση είναι η ίδια και για 2 ψηφία στις χιλιάδες καλό είναι μήπως και άν)Παρακαλώ όπως με βοηθήσει κάποιος γνώστης!
παπι Δημοσ. 6 Φεβρουαρίου 2013 Δημοσ. 6 Φεβρουαρίου 2013 http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo(v=vs.71).aspx
some1 Δημοσ. 6 Φεβρουαρίου 2013 Μέλος Δημοσ. 6 Φεβρουαρίου 2013 Δεν είμαι σίγουρος τι πρέπει να κάνω!
albNik Δημοσ. 6 Φεβρουαρίου 2013 Δημοσ. 6 Φεβρουαρίου 2013 Δοκίμασε αυτό αν τα δεκαδικά είναι το πολύ 2 string s = "1,3335.5"; double d = double.Parse(s.Replace(".", "").Replace(",", "")); var t = s.Split(new char[] { '.', ',' }, StringSplitOptions.RemoveEmptyEntries); if(t.Length > 1 && t[t.Length - 1].Length < 3) d /= Math.Pow(10, t[t.Length - 1].Length); Console.WriteLine(d.ToString("#.##", CultureInfo.InvariantCulture));
παπι Δημοσ. 6 Φεβρουαρίου 2013 Δημοσ. 6 Φεβρουαρίου 2013 Δεν είμαι σίγουρος τι πρέπει να κάνω! public static void Main(string[] args) { string gr = "1.000,41"; string us = "1,000.41"; double dgr = double.Parse(gr, CultureInfo.GetCultureInfo("el-GR").NumberFormat); double dus = double.Parse(us, CultureInfo.GetCultureInfo("en-US").NumberFormat); double res = dgr + dus; Console.WriteLine(res.ToString("#.##", CultureInfo.GetCultureInfo("en-US").NumberFormat)); Console.ReadLine(); }
bnvdarklord Δημοσ. 6 Φεβρουαρίου 2013 Δημοσ. 6 Φεβρουαρίου 2013 Γινεται αυτό; Δηλαδή πώς ξεχωρίζεις το 3,541 από το 3.541 ; edit: ακυρο δεν ειδα οτι ειναι μεχρι 2 δεκαδικά.
some1 Δημοσ. 6 Φεβρουαρίου 2013 Μέλος Δημοσ. 6 Φεβρουαρίου 2013 συγγνώμη εαν δεν έχω καταλάβει τις λύσεις σας, αλλά το θέμα είναι πως εγώ δεν γνωρίζω το Locale του αριθμού. Δηλαδή ο κώδικας θα πρέπει να αναγνωρίζει από μόνος του εάν το ποσό είναι της μορφής 1.345,05 ή 2,654.18, δηλαδή εαν είναι "αμερικάνικο" ή "ελληνικό" και μετά να το μετατρέπει. Ευχαριστώ.edit: για αυτό τον λόγω πρότεινα και την χρήση κάποιου regex? δηλαδή να αναγνωρίζει κάπως εάν είναι της μορφής #.###,## ή #,###.##, όπου # ένα νουμερικό ψηφίο.
παπι Δημοσ. 6 Φεβρουαρίου 2013 Δημοσ. 6 Φεβρουαρίου 2013 Αυτο θα το κανεις με regex, εφοσον ξερεις οτι ο αριθμος εχει παντα εως και 2 δεκατικα. Τι τιμες κλεβεις;
some1 Δημοσ. 6 Φεβρουαρίου 2013 Μέλος Δημοσ. 6 Φεβρουαρίου 2013 έχει πάντα δυο δεκαδικά, γι αυτό ζήτησα την υλοποίηση με regex την οποία δεν κατέχω στην c#... είναι κώδικας σε μια .aspx σελίδα που μου επιστρέφει τα ποσά όπως προανέφερα, αλλά θέλω εγώ με την σειρά μου να προωθώ το συγκεκριμένο ποσό, κάπου αλλού που το δέχονται μόνον με το format που προανέφερα.
albNik Δημοσ. 6 Φεβρουαρίου 2013 Δημοσ. 6 Φεβρουαρίου 2013 Το regex είναι για να καθορίσεις αν είναι αριθμός, όχι για να βρεις την τιμή. Πάρε την τιμή του αριθμού χωρίς τα σύμβολα ',' και '.' και κάνε διαίρεση με 10 η 100 αν έχει σύμβολο στην προτελευταία η δεύτερη από το τέλος θέση. Αυτό έγραψα στο πιο πάνω μήνυμα .
some1 Δημοσ. 6 Φεβρουαρίου 2013 Μέλος Δημοσ. 6 Φεβρουαρίου 2013 Συγγνώμη αλλά με regex δεν μπορώ να δώ εάν μια μεταβλητή ανταποκρίνεται στην μορφή ##.###,## , όπου # ένας integer χαρακτήρας;
albNik Δημοσ. 6 Φεβρουαρίου 2013 Δημοσ. 6 Φεβρουαρίου 2013 Το string το έχεις ή πρέπει να το αναζητήσεις? Αν είναι το δεύτερο , ναι με RegEx
some1 Δημοσ. 6 Φεβρουαρίου 2013 Μέλος Δημοσ. 6 Φεβρουαρίου 2013 Το έχω. Έχω π.χ. την variable amount. Βασικά θα θελα if amount is (##.###,##) {do this}else if amount is (##,###.##) {do that}
albNik Δημοσ. 7 Φεβρουαρίου 2013 Δημοσ. 7 Φεβρουαρίου 2013 To d παίρνει τη σωστή τιμή του amount και στις 2 μορφές του. Σε C# double d = double.Parse(amount.Replace(".", "").Replace(",", "")); var t = amount.Split(new char[] { '.', ',' }, StringSplitOptions.RemoveEmptyEntries); if(t.Length > 1 && t[t.Length - 1].Length < 3) d /= Math.Pow(10, t[t.Length - 1].Length); Console.WriteLine(d.ToString("0.00", CultureInfo.InvariantCulture));
παπι Δημοσ. 7 Φεβρουαρίου 2013 Δημοσ. 7 Φεβρουαρίου 2013 Τωρα που λειπει ο defecer, ας ποσταρω την μακαροναδα μου. public static void Main(string[] args) { string gr = "1.000,41"; string us = "1,000.41"; var res = Parse(gr) + Parse(us); Console.WriteLine(res.ToString("#.##", CultureInfo.GetCultureInfo("en-US").NumberFormat)); Console.ReadLine(); } static double Parse(string str) { try { //try us return double.Parse(str, CultureInfo.GetCultureInfo("en-US").NumberFormat); } catch (FormatException) { try { //try gr return double.Parse(str, CultureInfo.GetCultureInfo("el-GR").NumberFormat); } catch (Exception e) { throw new Exception("kati de paei kala mpla mpla", e); } } catch (Exception e) { throw new Exception("kati de paei kala mpla mpla", e); } } }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα