Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα σας.

 

Χρειάζεται να κάνω την εξής τροποποίηση σε έναν κώδικα και επιθυμώ την βοήθεια σας. Τραβάω από κάπου κάποια ποσά με την εξής ιδιαιτερότητα. Άλλες φορές έχουν ως:


σημείο για τις χιλιάδες την τελεία "." και για δεκαδικά το κόμμα "," (όπως το Ελληνικό σύστημα)

 

και άλλες

 

το ανάποδο, τελεία για τα δεκαδικά και κόμμα στις χιλιάδες (Αμερικάνικο σύστημα)

Θέλω αυτά τα ποσά να μετατρέπονται στο Αμερικάνικο σύστημα (τελεία για δεκαδικά) και χωρίς κανένα σημείο στίξης στις χιλιάδες.

Δηλαδή

sum1 = 2.056,14 -> 2056.14
και αντίστοιχα
sum2 = 3,567.90 -> 3567.90

Μπορεί το παραπάνω να γίνει εύκολα σε μια-δυό γραμμές με κάποιο regex, ίσως? Τα ποσά δεν ξεπερνούν το 9.999,99 δηλαδή πάντα μέχρι 2 δεκαδικά ψηφία και μονοψήφια χιλιάδα (εάν η υλοποίηση είναι η ίδια και για 2 ψηφία στις χιλιάδες καλό είναι μήπως και άν)

Παρακαλώ όπως με βοηθήσει κάποιος γνώστης!

  • Απαντ. 35
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Δημοσ.

Δοκίμασε αυτό αν τα δεκαδικά είναι το πολύ 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));

 

 

Δημοσ.

Δεν είμαι σίγουρος τι πρέπει να κάνω!  :whistle:

 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();
        }
Δημοσ.

συγγνώμη εαν δεν έχω καταλάβει τις λύσεις σας, αλλά το θέμα είναι πως εγώ δεν γνωρίζω το Locale του αριθμού. Δηλαδή ο κώδικας θα πρέπει να αναγνωρίζει από μόνος του εάν το ποσό είναι της μορφής 1.345,05 ή 2,654.18, δηλαδή εαν είναι "αμερικάνικο" ή "ελληνικό" και μετά να το μετατρέπει. Ευχαριστώ.

edit: για αυτό τον λόγω πρότεινα και την χρήση κάποιου regex? δηλαδή να αναγνωρίζει κάπως εάν είναι της μορφής #.###,## ή #,###.##, όπου # ένα νουμερικό ψηφίο.

Δημοσ.

έχει πάντα δυο δεκαδικά, γι αυτό ζήτησα την υλοποίηση με regex την οποία δεν κατέχω στην c#... είναι κώδικας σε μια .aspx σελίδα που μου επιστρέφει τα ποσά όπως προανέφερα, αλλά θέλω εγώ με την σειρά μου να προωθώ το συγκεκριμένο ποσό, κάπου αλλού που το δέχονται μόνον με το format που προανέφερα.

Δημοσ.

Το regex είναι για να καθορίσεις αν είναι αριθμός, όχι για να βρεις την τιμή.

 

Πάρε την τιμή του αριθμού χωρίς τα σύμβολα ',' και  '.'   και κάνε διαίρεση με 10 η 100 αν έχει σύμβολο στην προτελευταία η δεύτερη από το τέλος θέση.

Αυτό έγραψα στο πιο πάνω μήνυμα .

Δημοσ.

Συγγνώμη αλλά με regex δεν μπορώ να δώ εάν μια μεταβλητή ανταποκρίνεται στην μορφή ##.###,## , όπου # ένας integer χαρακτήρας;

Δημοσ.

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));
Δημοσ.

Τωρα που λειπει ο 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);
            }
            
 
        }
    }

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...