chrislem Δημοσ. 9 Ιουνίου 2010 Δημοσ. 9 Ιουνίου 2010 Παιδιά καλησπέρα σας! Δουλεύω πάνω σε Borland C++ Builder. Έχω μία φόρμα και ένα Edit Box! Θέλω στο Edit Box ο χρήστης να βάζει αποκλειστικά αριθμούς. Τι κώδικα θα γράψω για να ελέγξω το παραπάνω? Θέλω δλδ να δέχεται μόνο αριθμούς και σε περίπτωση που εισάγει κάποιο χαρακτήρα η σημείο στίξης να βγάζει ένα μνμ λάθους και να επιστρέφει ξανά στην φόρμα! Ευχαριστώ προκαταβολικά για την βοήθεια σας.
bnvdarklord Δημοσ. 9 Ιουνίου 2010 Δημοσ. 9 Ιουνίου 2010 Δεν ξερω κατα πόσο ο τρόπος αυτός ειναι καλος αλλα βρήκα το εξης κάπου(ΝaN = Not a Number) According to the IEEE standard, NaN values have the odd property that comparisons involving them are always false. That is, for a float f, f != f will be true only if f is NaN. Μπορείς επίσης να βαλεις σε ενα try την μετατροπή του κειμενου σε integer και αν πετάξει exception σημαινει οτι εχει και αλλους χαρακτήρες μεσα...
Aragorn Elessar Δημοσ. 9 Ιουνίου 2010 Δημοσ. 9 Ιουνίου 2010 Πριν λίγα χρόνια είχα γράψει το κλασσικό πρόγραμμα μετατροπής σε Celsius και Φαρενάιτ. Εχω ενσωματωμένη αυτή την δυνατότητα. Ελπίζω να σε βοηθήσει: > // // File: temp.cc // Author: blackslash13 // // Created on 29 Νοέμβριος 2007, 11:06 μμ // #include <stdlib.h> #include <iostream> #include <string> #include <sstream> #include <iomanip> #include <limits> bool inputDouble(std::string prompt, double &val) { std::string input; for( ;; ) { std::stringstream sstr; std::cout << prompt; if (!std::getline(std::cin, input)) return false; // Failed to read input. sstr << input; if (sstr >> val) { return true; } else { std::cout << "Error, not a valid number" << std::endl; } } } double fahrenheitToCelsius(double fahrenheit) { double celsius; celsius = (fahrenheit-32)/1.8; return celsius; } double celsiusToFahrenheit(double celsius) { double fahrenheit; fahrenheit = 1.8 * celsius + 32 ; return fahrenheit; } void makeTable(double start, double end, double step, double choice) { using namespace std; cout.setf(ios::fixed); double i(0),fahr,celsius; if(choice==1) { for(i=start; i<=end; i+=step) { fahr=celsiusToFahrenheit(i); cout << setprecision(2) << setw(5) << i << "\t\t" << fahr << endl; } } else { for(i=start; i<=end; i+=step) { celsius=fahrenheitToCelsius(i); cout << setprecision(2) << setw(5) << i << "\t\t" << celsius << endl; } } } // // // int main(int argc, char** argv) { { using namespace std; double choice,choice2; double degree,lowBound,maxBound,step; cout << "Select a number" << endl << "1. Celsius to Fahrenheit\n2. Fahrenheit to Celsius" << endl << "Your Choice:"; cin >> choice; while(!cin.good() || choice<1 || choice>2) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(),'\n'); cout << "Not valid selection.... Your Choice:"; cin >> choice; } if(choice == 1) { cout << "Select a number" << endl << "1. Specific conversion\n2. Print table list" << endl << "Your Choice:"; cin >> choice2; while(!cin.good() || choice2<1 || choice2>2) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(),'\n'); cout << "Not valid selection.... Your Choice:"; cin >> choice2; } /* Thrash the garbage from input strem */ cin.clear(); cin.ignore(1,'\n'); if(choice2==1) { while(!inputDouble("Enter Celsius temperature degree:", degree) || degree<=-316 || degree>=316) { cout << "Not valid selection...."; } cout << degree << " Celsius = " << celsiusToFahrenheit(degree) << " Fahrenheit." << endl; } else { while(!inputDouble("Enter Celsius lower bound degree:",lowBound) || lowBound<=-316 || lowBound>=316) { cout << "Not valid selection...."; } while(!inputDouble("Enter Celsius maximum bound degree:",maxBound) || maxBound<=-316 || maxBound>=316) { cout << "Not valid selection...."; } while(!inputDouble("Enter increment value for the list:",step) || step<=0) { cout << "Not valid selection...."; } cout << "Celsius\t\tFahrenheit" << endl; makeTable(lowBound, maxBound, step,1); } } else { cout << "Select a number" << endl << "1. Specific conversion\n2. Print table list" << endl << "Your Choice:"; cin >> choice2; while(!cin.good() || choice2<1 || choice2>2) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(),'\n'); cout << "Not valid selection.... Your Choice:"; cin >> choice2; } /* Thrash the garbage from input strem */ cin.clear(); cin.ignore(1,'\n'); if(choice2==1) { while(!inputDouble("Enter Fahrenheit temperature degree:", degree) || degree<=-316 || degree>=316) { cout << "Not valid selection...."; } cout << degree << " Fahrenheit = " << fahrenheitToCelsius(degree) << " Celsius." << endl; } else { while(!inputDouble("Enter Fahrenheit lower bound degree:",lowBound) || lowBound<=-316 || lowBound>=316) { cout << "Not valid selection...."; } while(!inputDouble("Enter Fahrenheit maximum bound degree:",maxBound) || maxBound<=-316 || maxBound>=316) { cout << "Not valid selection...."; } while(!inputDouble("Enter increment value for the list:",step) || step<=0) { cout << "Not valid selection...."; } cout << "Fahrenheit\tCelsius" << endl; makeTable(lowBound, maxBound, step,2); } } return 0; } return (EXIT_SUCCESS); } Αυτό που κάνω είναι να ελεγχω το την ιδιότητα good του standard input stream.
chrislem Δημοσ. 9 Ιουνίου 2010 Μέλος Δημοσ. 9 Ιουνίου 2010 Παιδιά σας ευχαριστώ για τις γρήγορες απαντήσεις αλλά ξέχασα να πω , και συγχωρέστε με γι αυτό, ότι δουλεύω σε οπτικό περιβάλλον και θέλω να γράψω κώδικα πάνω σε ένα κουμπί! Οπότε αυτά δεν με βοηθάνε και πολύ. Θέλω απλά μία εντολή που να το κάνει αυτό.. Πείτε μου όσο πιο απλά γίνεται γιατί δεν γνωρίζω και πάρα πολλά.. Σας ευχαριστώ πολύ και πάλι!
bnvdarklord Δημοσ. 9 Ιουνίου 2010 Δημοσ. 9 Ιουνίου 2010 Παιδιά σας ευχαριστώ για τις γρήγορες απαντήσεις αλλά ξέχασα να πω , και συγχωρέστε με γι αυτό, ότι δουλεύω σε οπτικό περιβάλλον και θέλω να γράψω κώδικα πάνω σε ένα κουμπί! Οπότε αυτά δεν με βοηθάνε και πολύ. Θέλω απλά μία εντολή που να το κάνει αυτό.. Πείτε μου όσο πιο απλά γίνεται γιατί δεν γνωρίζω και πάρα πολλά.. Σας ευχαριστώ πολύ και πάλι! Νομιζω μπορεις να χρησιμοποιησεις αυτο που σου ειπα στον κωδικα κουμπιου...
V.I.Smirnov Δημοσ. 9 Ιουνίου 2010 Δημοσ. 9 Ιουνίου 2010 Πρέπει να υπάρχει ιδιότητα του κουμπιού που περιορίζει την εισαγωγή αποκλειστικά σε κείμενο ή αριθμούς. Συνήθως αυτό γίνεται. Πχ. έτσι το είχα δει κάποτε στην visual C++. Αλλιώς ελέγχεις το string που εισάγεται και αν περιέχει γράμμα απορρίπτεις το string ως άκυρο. Οι αριθμοί 0-9 και το "." έχουν συγκεκριμένη θέση στο ascii αλφάβητο οπότε είναι εύκολο.
parsifal Δημοσ. 9 Ιουνίου 2010 Δημοσ. 9 Ιουνίου 2010 Πρέπει να υπάρχει ιδιότητα του κουμπιού που περιορίζει την εισαγωγή αποκλειστικά σε κείμενο ή αριθμούς. Το NumbersOnly Property της κλάσης TEdit. Αλλά κάνει μισή δουλειά: Use NumbersOnly to prohibit entry of non-numeric characters in the textfield. Note, however, that a user can paste non-numeric characters in the textfield even when this property is set.
Directx Δημοσ. 9 Ιουνίου 2010 Δημοσ. 9 Ιουνίου 2010 Εφόσον δουλεύεις με τις νεότερες εκδόσεις του C++ Builder μπορείς να εκμεταλλευτείς το NumbersOnly property του TEdit το οποίο προανέφερε ο Parsifal ώστε να μπλοκάρεις αυτόματα την εισαγωγή μη αριθμητικών χαρακτήρων στο TEdit δίχως να χρειασθεί να γράψεις δικό σου κώδικα. Τώρα αν χρησιμοποιείς κάποιον παλιό C++ Builder που δεν διαθέτει το NumbersOnly property, θα πρέπει να γράψεις κώδικα στο OnKeyPress event του TEdit ώστε να μπλοκάρεις κάθε μη επιθυμητό Key ορίζοντας το ως 0. Από εκεί και πέρα, όσον αφορά το Paste, μπορείς να εντοπίσεις το κείμενο που εισάγεται στο TEdit (άμεσα) χρησιμοποιώντας το OnChange event το οποίο ενεργοποιείται κάθε φορά που ο χρήστης τροποποιεί τα περιεχόμενα του TEdit component οπότε σε συνδυασμό με το NumbersOnly property που απαγορεύει την εισαγωγή μη αριθμητικών χαρακτήρων από το πληκτρολόγιο μπορείς να πιάσεις έμμεσα περιπτώσεις "μη αριθμητικών - Paste". Ακολουθεί κώδικας στο OnChange event που ελέγχει αν το κείμενο (->Text) του TEdit περιέχει μη αριθμητικούς χαρακτήρες μηδενίζοντας το περιεχόμενο του component και πετώντας exception αν συμβαίνει κάτι τέτοιο: > // Cast TObject *Sender to TEdit* TEdit *ptrEditBox = (TEdit*)Sender; // VCL string-arrays begin from 1 (instead of 0). for(int TLen = 1; TLen <= ptrEditBox->Text.Length(); TLen++) if(!isdigit(ptrEditBox->Text[TLen])) // Stop on non digit characters. { // Clear component text. ptrEditBox->Text = "0"; // Notify user! throw Exception("You should enter only numbers!"); } Καλή συνέχεια!
3c0r1z Δημοσ. 9 Ιουνίου 2010 Δημοσ. 9 Ιουνίου 2010 Εναλλακτικά θα μπορούσε να αποθηκεύσει σε string το αποτέλεσμα και να χρησιμοποιήσει την find_first_not_of για να κάνει τον έλεγχο: >size_t number = 0; size_t found = myString.find_first_not_of("0123456789"); if(found != string::npos) //επιστροφή στην φόρμα else { stringstream sstr; sstr << myString; sstr >> number; }
chrislem Δημοσ. 9 Ιουνίου 2010 Μέλος Δημοσ. 9 Ιουνίου 2010 Παιδιά το πρόβλημα λύθηκε με την χρήση του IsDigit! Σας ευχαριστώ πολύ όλους για τις απαντήσεις σας!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.