Floating Point Αριθμός ανάλυσης: Υπάρχει μια παγίδα Όλα αλγόριθμο;

ψήφοι
52

Ένα από τα διασκεδαστικά μέρη της πολυ-πολιτισμικής προγραμματισμού είναι μορφές αριθμών.

  • Αμερικανοί χρησιμοποιούν 10,000.50
  • Γερμανοί χρησιμοποιούν 10.000,50
  • Γαλλικά χρήση 10 000,50

Η πρώτη μου προσέγγιση θα ήταν να πάρει το string, να αναλύσει τα πίσω, μέχρι να συναντήσετε ένα διαχωριστικό και το χρησιμοποιεί ως δεκαδικά μου διαχωριστικό. Υπάρχει μια προφανής ελάττωμα με αυτό: 10.000 θα πρέπει να ερμηνευθεί ως 10.

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

Η προφανής «καλύτερη λύση» θα ήταν να εντοπίσει τον πολιτισμό ή browser του χρήστη, αλλά αυτό δεν λειτουργεί αν έχετε ένα Γάλλο χρησιμοποιώντας ένα en-US Windows / Browser.

Μήπως το .NET Framework περιέχει κάποια μυθική μαύρη μαγεία κινητής υποδιαστολής αναλυτή που είναι καλύτερη από ό, τι Double.(Try)Parse()στην προσπάθεια για αυτόματο εντοπισμό, τη μορφή των αριθμών;

Δημοσιεύθηκε 01/08/2008 στις 20:23
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
26

Νομίζω ότι το καλύτερο που μπορείτε να κάνετε σε αυτή την περίπτωση είναι να πάρετε τη συμβολή τους και στη συνέχεια να τους δείξουμε τι νομίζεις ότι σημαίνει. Εάν διαφωνούν, να τους δείξουμε τη μορφή που περιμένουμε και να τους πάρει για να εισέλθετε ξανά.

Απαντήθηκε 02/08/2008 στις 00:17
πηγή χρήστη

ψήφοι
26

Δεν ξέρω την πλευρά ASP.NET του προβλήματος, αλλά ΝΕΤ έχει ένα πολύ ισχυρό κατηγορία: System.Globalization.CultureInfo . Μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα για να αναλύσει ένα string που περιέχει ένα διπλό τιμή:

double d = double.Parse("100.20", CultureInfo.CurrentCulture);
//  -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);

Αν ASP.NET με κάποιο τρόπο (π.χ. με τη χρήση κεφαλίδες HTTP Request) περνάει CultureInfo τρέχοντος χρήστη είτε CultureInfo.CurrentCulture ή CultureInfo.CurrentUICulture, αυτά θα δουλεύουν μια χαρά.

Απαντήθηκε 01/08/2008 στις 21:02
πηγή χρήστη

ψήφοι
11

Δεν μπορείτε να ικανοποιεί τους πάντες. Αν μπαίνω δέκα ως 10.000, και κάποιος μπαίνει δέκα χιλιάδες ως 10.000, δεν μπορείτε να χειριστείτε αυτό χωρίς κάποια γνώση του πολιτισμού της εισόδου. Εντοπισμός του πολιτισμού με κάποιο τρόπο (πρόγραμμα περιήγησης, η ρύθμιση του συστήματος -; ποια είναι η περίπτωση χρήσης ASP εσωτερική εφαρμογή, ή ανοικτή στον κόσμο), ή να παρέχουν ένα παράδειγμα της αναμενόμενης μορφοποίηση, και να χρησιμοποιήσετε το πιο επιεικείς αναλυτή μπορείτε. Μάλλον κάτι σαν:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Απαντήθηκε 01/08/2008 στις 21:05
πηγή χρήστη

ψήφοι
9

Η διαφορά μεταξύ 12.345 στα γαλλικά και τα αγγλικά είναι ένας παράγοντας του 1000. Αν σας προμηθεύσει ένα αναμενόμενο εύρος όπου max <1000 * min, μπορείτε εύκολα να μαντέψει.

Πάρτε για παράδειγμα το ύψος ενός ατόμου (συμπεριλαμβανομένων των βρεφών και των παιδιών) σε mm.

Με τη χρήση ενός φάσματος 200-3000, μια είσοδος των 1.800 ή 1.800 μπορεί αδιαμφισβήτητα να ερμηνευθεί ως 1 μέτρο και 80 εκατοστά, ενώ μια είσοδος των 912.300 ή 912.300 μπορεί αδιαμφισβήτητα να ερμηνευθεί ως 91 εκατοστά και το 2,3 χιλιοστά.

Απαντήθηκε 02/08/2008 στις 13:28
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more