Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Currency???

Îåêßíçóå áðü ôï ìÝëïò Ευθύμης Δημόπουλος. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 23-12-2006, 08:30. Υπάρχουν 37 απαντήσεις.
Σελίδα 3 από 3 (38 εγγραφές)   < 1 2 3
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  21-12-2006, 12:37 22644 σε απάντηση της 22613

    Απ: Currency???

     pkanavos wrote:

    Παρακάτω είναι ο κώδικας που χρησιμοποίησα για τις δοκιμές:



                Dim insertCmd As New OleDbCommand("Insert Into Books (Title,Price) VALUES(@title,@price)")
                insertCmd.Parameters.Add("@title", OleDbType.Char).Value = "Zonk1"
                insertCmd.Parameters.Add("@price", OleDbType.Currency).Value = 3.14
                '*** Uncomment to reproduce error
                'insertCmd.Parameters.Add("@price", OleDbType.Decimal).Value = 3.14
                insertCmd.Connection = con
                insertCmd.ExecuteNonQuery()




    Ωραίος....

    Παναγιώτη,

    μόνο ένα θεματάκι έχω...
    αν αντί
            insertCmd.Parameters.Add("@price", OleDbType.Currency).Value = 3.14

    βάλω

           insertCmd.Parameters.Add("@price", OleDbType.Currency).Value = pprice

    όπου pprice=textbox1.text

    η μεταβλητή pprice τι μπορεί να είναι;

    δε μου δουλεύει ούτε σαν decimal ούτε σαν double!

    Dim pprice as ???

    Pprice= ???(textbox1.text)


  •  21-12-2006, 19:00 22667 σε απάντηση της 22644

    Απ: Currency???

    Μπορεί να είναι και currency και double. Γράφεις Dim pprice as Double=CDbl(textbox1.text) ή Dim pprice as Decimal =CDec(textbox1.Text)
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  22-12-2006, 14:18 22709 σε απάντηση της 22667

    Απ: Currency???

    χμμμ

    συγνώμη Παναγιώτη για τη ταλαιπωρία...

    αλλά το πρόβλημα εξακολουθεί και υπάρχει...

    όταν του λες

    insertCmd.Parameters.Add("@price", OleDbType.Currency).Value = 3.14

    το παίρνει κανονικά στην access

    αλλά όταν του λες

    Dim pprice as Double=CDbl(txtPrice.text)

    ή

    Dim pprice as Decimal =CDec(txtPrice.Text)

    ...

    insertCmd.Parameters.Add("@price", OleDbType.Currency).Value = pprice

    δυστυχώς το περνάει σαν 314 (ενώ γράφεις στο textbox "3.14") !!!

    ....

    τόσο δύσκολο είναι να προβλέψουν στην κατασκευή της vb αυτό το φαινόμενο άραγε;;;

  •  22-12-2006, 15:16 22717 σε απάντηση της 22709

    Απ: Currency???

    Το έχω δοκιμάσει και γώ και το πρόβλημα είναι στην μετατροπή του text σε decimal. Είναι το πρόβλημα με το cultureinfo... Bάλε ένα breakpoint μετά τη μετατροπή και θα δείς ότι η pprice έχει τιμή 314.. Αλλάζοντας το cultureinfo γίνεται 3.14...
    View Παναγιώτης Χαραλάμπους's profile on LinkedIn
    Coding at Mediterranean Acoustics
  •  22-12-2006, 21:24 22731 σε απάντηση της 22709

    Απ: Currency???

    To σωστό είναι να πεις



    insertCmd.Parameters.Add("@price", OleDbType.Currency).Value = Double.Parse(txtPrice.Text)

    H μέθοδος Parse μπορεί να δεχθεί ως παράμετρο τον τρόπο που ερμηνεύσει τα κόμματα και τις τελείες. Τυπικά θα θεωρήσει ότι είναι αυτά που ισχύουν γα το τρέχον locale του συστήματος, δηλαδή δεν χρειάζεται να ανησυχείς ιδιαίτερα. Βέβαια, υποτίθεται ότι ο χρήστης θα γράφει τα νούμερα με τον ανάλογο τρόπο. Γι αυτό και δεν είναι καλό να αλλάζεις το locale του thread απλώς για να εξυπηρετήσεις έναν χρήστη που δεν ξέρει να γράφει τα νούμερα σύμφωνα με τον τρόπο του locale. Θα μπερδέψεις όλους τους υπόλοιπους που τα γράφουν σωστά. Άσε που όταν αρχίσει να μεγαλώνει ο κώδικας, γίνεται εύκολο το να σου ξεφύγει να επιστρέψεις στο σωστό locale, οπότε μετά... hell breaks loose!


    Vir prudens non contra ventum mingit
  •  22-12-2006, 22:14 22733 σε απάντηση της 22731

    Απ: Currency???

    το δοκίμασα και με τους δυο τροπους και δεν παιζει... Φαντάζομαι ότι το πρόβλημα είναι με το 3.14 και όχι με το 3,14 ετσι?
    View Παναγιώτης Χαραλάμπους's profile on LinkedIn
    Coding at Mediterranean Acoustics
  •  22-12-2006, 23:12 22734 σε απάντηση της 22733

    Απ: Currency???

    Νομίζω ότι δεν έχουμε συνεννοηθεί... Ανακεφαλαίωση: Δεν υπάρχει θέμα προβλήματος! Η Parse μέθοδος θα ερμηνεύσει έναν από τους δύο χαρακτήρες (κόμμα ή τελεία) ως τον χαρακτήρα που υποδηλώνει την έναρξη των δεκαδικών ψηφίων, ανάλογα με τα regional settings του υπολογιστή. Δεν γίνεται να ερμηνεύσει και τα δύο ως υποδιαστολές. Απο εκεί και πέρα όλα τα προγράμματα ακολουθούν αυτήν την λογική. Δεν είναι δουλειά του προγράμματος να ξέρει ποιος χαρακτήρας είναι η υποδιαστολή. Επιπρόσθετα οι χρήστες θα πρέπει να έχουν ένα consistency στον τρόπο που δίνουν τα νούμερα. Αν ένας χρήστης χρησιμοποιήσει το πρόγραμμά σου και εισάγει δεκαδικούς με το κόμμα ως υποδιαστολή και κατόπιν το EXCEL όπου υποδιαστολή είναι η τελεία (για το Ελληνικό locale), θα νιώθει πολύ μπερδεμένος. Αυτά ως προς το UI. Στον κώδικα τώρα, είτε πρόκειται για SQL, είτε για C#, είτε για VB.NET, η υποδιαστολή είναι πάντοτε η τελεία. Από την άλλη μεριά με την Parse, δεν χρειάζεται να ασχοληθείς πώς ένα string που το πέρνεις από κάποιο textbox, θα μετατραπεί σε double/decimal. Garbage-in, garbage-out.

    Ουσιαστικά το θέμα σου είναι πως θα κάνεις σωστό validation. Αν θέλεις κατά το data entry να επιτρέπεις μόνο την υποδιαστολή τότε μπορείς να διαβάσεις ποιός είναι ο χαρακτήρας της υποδιαστολής χρησιμοποιώντας την

    Dim decSep As Char = System.Globalization.CultureInfo.CurrentCulture.Nu mberFormat.NumberDecimalSeparator

    Αντίστοιχα, το

    Dim grpSep As Char = System.Globalization.CultureInfo.CurrentCulture.Nu mberFormat.NumberGroupSeparator

    σου δίνει τον χαρακτήρα για grouping (δεκάδες, χιλιάδες, κλπ). Κατόπιν, μπορείς είτε στο KeyPress/KeyUp/KeyDown να κόβεις αυτόν τον χαρακτήρα, είτε στο Validate event να ελέγχεις αν περιέχεται στο string.

     

     


    Vir prudens non contra ventum mingit
  •  23-12-2006, 08:30 22736 σε απάντηση της 22734

    Απ: Currency???

    Φαντάζομαι ότι ο Efthimis έχει στο μηχάνημα του ελληνικά regional settings, ή έχει αλλάξει από το Control Panel την υποδιαστολή σε κόμμα. Στην περίπτωση αυτή, η CDbl και η Double.Parse και η CDec και η Decimal.Parse θα μεταφράσουν το 3.14 σε 314. Αυτός είναι ο σωστός τρόπος λειτουργίας και δεν αλλάζει. Το σωστό είναι να εισάγει στο Textbox 3,14 όχι 3.14. Ακόμα και η τελεία του αριθμητικού πληκτρολογίου γυρίζει σε κόμμα όταν αλλάζεις γλώσσα με Alt+Shift και πας σε ελληνικά!

    Εδώ μιλάμε για τελείως άλλο ζήτημα, όχι για regional settings. Τί υποδιαστολή θέλει ο Efthimis να χρησιμοποιούν οι χρήστες του? Την ρυθμισμένη? Τότε δεν έχει πρόβλημα. Θέλει να τους κάνει να χρησιμοποιούν μία συγκεκριμένη? Τότε πρέπει να γράψει κώδικα στο Textbox και αλλού για να κάνει μετατροπές. Δεν το συνιστώ, και δεν θα αρέσει και στους χρήστες.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Σελίδα 3 από 3 (38 εγγραφές)   < 1 2 3
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems