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

 

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

Τοπικές ρυθμίσεις - Χαρακτήρας υποδιαστολής

Îåêßíçóå áðü ôï ìÝëïò pantelee. Τελευταία δημοσίευση από το μέλος pantelee στις 28-12-2006, 21:28. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-12-2006, 13:19 22341

    Confused [*-)] Τοπικές ρυθμίσεις - Χαρακτήρας υποδιαστολής

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

    Το πρόβλημα:
    Το αρχείο .txt περιέχει δεκαδικούς αριθμούς. Σε μένα το πρόγραμμα έτρεχε κανονικά. Σε άλλον υπολογιστή όμως έβγαζε σφάλματα. Τελικά ήταν θέμα Τοπικών Ρυθμίσεων (Πίνακας ελέγχου > Τοπικές Ρυθμίσεις) όπου (πατώντας Προσαρμογή) όρισα το χαρακτήρα της υποδιαστολής από "," σε "." και μετά όλα καλά.

    Η ερώτηση:
    Μπορώ να γνωρίζω (σε χρόνο εκτέλεσης) από κάποια σταθερά ίσως (π.χ. vbDecimalPoint) ποια είναι η ρύθμιση του υπολογιστή στον οποίο τρέχει το πρόγραμμα;

    Το συγκεκριμένο πρόβλημα ίσως μπορεί να ξεπεραστεί με μία διαφορετική αντιμετώπιση χωρίς να έχω την απάντηση στην παραπάνω ερώτηση (δείτε την παρακάτω πατέντα) αλλά βρέθηκα μπροστά σε ένα πρόβλημα το οποίο με έκανε να αναθεωρήσω κάποιες σειρές κώδικα που έχω γράψει και σε άλλα προγράμματα στα οποία δεν είχε τύχει μέχρι τώρα να εμφανιστεί κάτι ανάλογο. Γι αυτό και θα ήθελα την απάντηση στη συγκεκριμένη ερώτηση. Κατά τα άλλα, φυσικά, κάθε πρόταση ευπρόσδεκτη.

    Η πατέντα:
    Στο αρχείο .txt και πριν από τα δεδομένα να υπάρχει η γραμμή "3,1415" και στο άνοιγμα του αρχείου ο κώδικας να διαβάζει την γραμμή, να την τοποθετεί π.χ. στη μεταβλητή CurLine και στη συνέχεια:
    If Val(CurLine) = 3,1415 Then
      DecPt = ","
    Else 'Που σε αυτήν την περίπτωση μάλλον θα είναι 3
      DecPt = "."
    End If
    Stick out tongue

    Ευχαριστώ εκ των προτέρων
    Παντελής

    -------------------------------------------------------------

    Edit:
    Η κατά τα άλλα αστεία πατέντα με οδήγησε σε κάποια ενδιαφέροντα στοιχεία. Δοκίμασα κάποια πράγματα και βρήκα:
    Το Val("3,14") επιστρέφει πάντα 3 ανεξαρτήτως τοπικών ρυθμίσεων
    Το Val("3.14") επιστρέφει 3,14 ή 3.14 ανάλογα με τις τοπικές ρυθμίσεις.

    Δηλαδή οι τοπικές ρυθμίσεις δεν επηρρεάζουν την είσοδο αλλά την έξοδο; Και γιατί είχα πρόβλημα με την είσοδο των δεδομένων;

    Σκέφτηκα λοιπόν το αποτέλεσμα του Val("3.14") να το εκμεταλευτώ εφόσον αυτό εξαρτάται από τις τοπικές ρυθμίσεις.
    Το Str(Val("3.14")) επιστρέφει πάντα "3.14" (με το κενό μπροστά αντί του προσήμου).
    Και τελικά αυτό που έδωσε τη λύση: Το Format(Val("3.14")) επιστρέφει αλφαριθμητικά "3,14" ή "3.14" ανάλογα με τις ρυθμίσεις.

    Δηλαδή η γραμμή
    DecPt = Mid(Format(Val("3.14")), 2, 1)
    επιστρέφει στο DecPt το χαρακτήρα της υποδιαστολής σύμφωνα με την τοπική ρύθμιση.

    Να θεωρήσω ότι το πρόβλημα λύθηκε; Κάτι πιο δόκιμο; Ένα "Ναι μεν, αλλά...";
  •  16-12-2006, 15:15 22343 σε απάντηση της 22341

    Απ: Τοπικές ρυθμίσεις - Χαρακτήρας υποδιαστολής

    Έχεις μπερδέψει λίγο το τί συμβαίνει. H Val θεωρεί ότι η υποδιαστολή είναι το . πάντα. Το ίδιο και η Str. Όταν τυπώνεις το αποτέλεσμα της Val όμως, μετατρέπεις αυτόματα τον αριθμό σε string. Η VB χρησιμοποιεί τα regional settings στις μετατροπές, γι αυτό και είδες την παραπάνω συμπεριφορά. Καλό είναι να xρησιμοποιείς τις Str και Val μόνο όταν γράφεις σε text αρχεία.

    Αν θέλεις να χρησιμοποιήσεις τα regional settings, χρησιμοποίησε τις CStr και CDec, CDbl, CLng κλπ. Αυτές πρέπει να τις χρησιμοποιείς οπωσδήποτε σε UI γιατί η VB χρησιμοποιεί τα regional settings στις μετατροπές. Αν δηλαδή έχεις ένα δεκαδικό αριθμό και ελληνικά regional settings, η VB θα τον εμφανίσει με "," για δεκαδικό. Αν χρησιμοποιήσεις Str και Val, θα έχεις πρόβλημα.

    Επίσης, όταν χρησιμοποιείς SQL Server, η μετατροπή των αριθμών γίνεται πάλι βάση των regional settings. Ούτε εκεί πρέπει να χρησιμοποιείς Str και Val.

    Εν συντομία, χρησιμοποίησε παντού τις CStr, CDbl κλπ, εκτός και αν θέλεις να έχεις γράψεις σε αρχεία, οπότε θέλεις να χρησιμοποιήσεις συγκεκριμένη υποδιαστολή. Τότε χρησιμοποίησε τις Str, Val.

    Περισσότερες πληροφορίες για όλα αυτά θα βρεις στο help της Visual Basic, στο "Writing International Code in Visual Basic".

    Κανονικά, δεν χρειάζεται να ξέρεις ποιός χαρακτήρας χρησιμοποιείται από το σύστημα για την υποδιαστολή. Αν ποτέ χρειαστείς όμως να το ξέρεις αυτό, μπορείς να χρησιμοποιήσεις τα funcitons GetNumberForma και GetCurrencyFormat του API. Επίσης, μπορείς να δεις τί υπάρχει στο registry, στο κλειδί HKEY_CURRENT_USER\Control Panel\International\sDecimal.

    Μην προσπαθείς να "διορθώσεις" τη συμπεριφορά της VB, γιατί θα υποχρεωθείς να ελέγχεις κάθε μετατροπή από αριθμό σε string, αυτόματη (όπως είδες με τη ? Val("3.14") ή μια Dim v as String: v=3.14) ή χειροκίνητη (Dim v as String: v=Str(3.14) ). Τέτοιες προσπάθεις δημιουργούν τα περισσότερα από τα προβλήματα που έχουν σχέση με τα regional settings.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-12-2006, 21:28 22875 σε απάντηση της 22341

    Απ: Τοπικές ρυθμίσεις - Χαρακτήρας υποδιαστολής

    Παναγιώτη σ' ευχαριστώ για την άμεση απόκριση και σαφή απάντησή σου.

    Η δική μου απόκριση καθυστέρησε καθώς έψαχνα να βρω απάντηση στο πρόβλημα ανάγνωσης του αρχείου. Αν και έχω καταλάβει κάθε γραμμή της απάντησής σου, το πρόβλημα αυτό ακόμα με παιδεύει.

    Πάντως δεν υπάρχει λόγος να εκκρεμεί το θέμα μιάς και η απάντηση είναι επαρκής (και μη μας βρει η νέα χρονιά να χρωστάμε!). Κάπου μέσα στις γραμμές της απάντησής σου βρίσκεται και η δική μου απάντηση.

    Και πάλι ευχαριστώ

    Παντελής
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems