tsomos:οκ...το βρηκα ...
MsgBox(Mid$(Format(1.2, "0.0"), 2, 1))
Δεν μπορώ να πω ότι ο παραπάνω κώδικας είναι ο κατάλληλος για να πετύχεις αυτό που θέλεις. Ακόμα και αν χρειαζόσουν να ξέρεις ποιό σύμβολο χρησιμοποιείται για δεκαδικό, που ΔΕΝ το χρειάζεσαι, η χρήση μεθόδων της VB6 σε κώδικα .NET μόνο μπελάδες θα σου δημιουργήσει. Καταρχήν, χρησιμοποιείς πολύ περισσότερο κώδικα για να κάνεις μία απλή δουλειά, μετά χρησιμοποιείς μεθόδους με γνωστά προβλήματα σε non-US υπολογιστές. Ας τα πάρουμε από την αρχή.
ΔΕΝ χρειάζεσαι το δεκαδικό - αν προσπαθήσεις να το "καρφώσεις" μάλιστα θα έχεις διαπράξει ένα από τα χειρότερα σφάλματα στο .NET . Το .NET καταλαβαίνει αυτόματα ποιό είναι το locale του χρήστη κι έτσι κάνει σωστά τις μετατροπές, χρησιμοποιώντας τα δεκαδικά που έχουν οριστεί στα Regional Settings. Μπορείς άνετα να αλλάξεις τη γλώσσα μίας εφαρμογής αλλάζοντας το CurrentCulture του Thread της εφαρμογής αλλά και αυτό συνήθως δεν χρειάζεται. Σε ένα PC με ελληνικά Windows, το .NET θα χρησιμοποιήσει αυτόματα το , ως δεκαδικό. Σε PC με αγγλικά Windows, το .
Δυστυχώς, πολλοί προγραμματιστές προσπαθούν να "καρφώσουν" το δεκαδικό για να αντιμετωπίσουν άλλα προβλήματα στον κώδικα τους. Για παράδειγμα, αν κάποιος χρησιμοποιεί χύμα SQL αντί για sql statements με παραμέτρους, θα έχει πρόβλημα αν ο αριθμός έχει , για δεκαδικό. Αντί όμως να διορθώσουν τον κώδικα τους, πολλοί προγραμματιστές θεωρούν ότι το πρόβλημα είναι του .NET και προσπαθούν να .... το διορθώσουν. Μία περιττή διόρθωση όμως συνήθως κάνει ζημιά, την οποία οι προγραμματιστές αυτοί προσπαθούν να διορθώσουν προσθέτωντας επιπλέον μυστήριο κώδικα. Έχοντας κληρονομήσει τέτοιο κώδικα στο παρελθόν, μπορώ να σε διαβεβαιώσω ότι η μόνη σωτηρία είναι να τον σβήσεις όλον. Γι αυτό και θεωρώ το κάρφωμα των δεκαδικών ως ένα από τα χειρότερα σφάλματα.
Σε αυτό τον καταστροφικό κώδικα έχω συναντήσει και προσπάθειες να βρεθεί το δεκαδικό με κώδικα παρόμοιο με αυτό που έδωσες. Τέτοιος κώδικας όμως ήταν περιττός ακόμα και στην VB6, γιατί μπορούσες πάντα να πάρεις το δεκαδικό μέσα από το κατάλληλο Win32 function. Στο .NET μπορείς να πάρεις όλες τις αντίστοιχες πληροφορίες μέσω του CultureInfo class και συγκεκριμένα του NumberFormat property. Μπορείς πχ. να βρεις ποιό είναι το δεκαδικό για την τρέχουσα εφαρμογή με το CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator ή της CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator. Βλέπεις, στα regional settings ο χρήστης μπορεί να ορίσει διαφορετικό format για χρηματικά ποσά και διαφορετικό για αριθμούς. Το .NET χρησιμοποιεί αυτόματα αυτά τα σύμβολα όταν μετατρέπει αριθμούς σε κείμενα και το αντίστροφο.
Τέλος, ο τρόπος με τον οποίο μετατρέπεις αριθμό σε κείμενο στο .NET είναι είτε η ToString() είτε η String.Format. Η Format που χρησιμοποίησες υπάρχει μόνο για συμβατότητα προς τα πίσω με τη VB6 και κληρονομεί όλα τα κουσούρια της. Αν θέλεις π.χ. να μετατρέψεις ένα αριθμό σε string, μπορείς να γράψεις String.Format("These are numbers {0} {1}",3.45,6.89) . Αν όμως οι αριθμοί είναι χρηματικά ποσά μπορείς να γράψεις String.Format("These are currency values {0:C} {1:C}",3.45,6.89) . Μπορείς να κάνεις και άλλους συνδυασμούς όπως να ορίσεις ακριβώς το συνολικό μήκος του string, τον αριθμό των δεκαδικών, το alignment κλπ.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos