Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Με τον παρακάτω κώδικα προσπαθώ να εισάγω μόνο αριθμητικές τιμές σε ένα input box και πιο συγκεκριμένα μόνο floats μέχρι δύο δεκαδικά.

 

Τα πρώτα δύο if δουλεύουν όπως πρέπει...

Το τρίτο το χρησιμοποιώ σε περίπτωση που ο χρήστη πάει να πληκτρολογήση περισσότερα εκ των δύο δεκαδικών μετά το κόμμα (τελεία) να μην τον αφήνει. Αλλά δείχνει να μη δουλεύει.

 

Μπορεί να βοηθήσει κάποιος;

 

*Η λύση με toFixed δυστυχώς κάνει στρογγυλοποίηση και αλλάζει το νούμερο.

$("#a").keypress(function (event) {
		
	    if(event.which != 8 && event.which != 0 && (event.which < 46 || event.which > 59)) {		
			event.preventDefault();
		}  
		
		if(event.which == 46 && $(this).val().indexOf('.') != -1) {
			event.preventDefault();
		}
		   
		
		if(event.which < 48 || event.which >57){
			if($(this).val().indexOf('.')!=-1){         
				if($(this).val().split(".")[1].length == 2){                
					event.preventDefault();
				}  
			}
		}
	
	});
Δημοσ.

Στον κώδικα που έχεις γράψει, αν ο χρήστης εισάγει κάποιον ακέραιο αριθμό, π.χ. 35, θα έχει πρόβλημα γιατί όταν θα κάνεις το split, το πεδίο [1] του πίνακά σου δεν υπάρχει, οπότε θα πάρεις error. Κάνε κάτι πιο απλό. Εφόσον θέλεις μέχρι δύο δεκαδικά ψηφία, έλεγξε το υπόλοιπο της διαίρεσης του αριθμού σου με το 0.01. Αν το υπόλοιπο είναι μεγαλύτερο από το 0, τότε έχεις παραπάνω από ένα δεκαδικά ψηφία.

if(Number($(this).val())%0.01 > 0){              
	event.preventDefault();
}
  • Like 1
Δημοσ.

 

Στον κώδικα που έχεις γράψει, αν ο χρήστης εισάγει κάποιον ακέραιο αριθμό, π.χ. 35, θα έχει πρόβλημα γιατί όταν θα κάνεις το split, το πεδίο [1] του πίνακά σου δεν υπάρχει, οπότε θα πάρεις error. Κάνε κάτι πιο απλό. Εφόσον θέλεις μέχρι δύο δεκαδικά ψηφία, έλεγξε το υπόλοιπο της διαίρεσης του αριθμού σου με το 0.01. Αν το υπόλοιπο είναι μεγαλύτερο από το 0, τότε έχεις παραπάνω από ένα δεκαδικά ψηφία.

if(Number($(this).val())%0.01 > 0){              
	event.preventDefault();
}

 

Καλη η ιδεα αλλα θα δουλευε μονο στο keyup οχι στο keydown.

 

Μια αλλη σιγουρα πιο απλη αλλα λιγο δοκιμασμενη περιπτωση, ειναι html5 attributes στο input και να "δουλεψεις" με την προηγουμενη και την νεα τιμη σε 2 event (keydown, keyup) που σιγουρα βολευει περισσοτερο εχοντας ολο το value και το :invalid.

 

Έτσι δεν χρειάζεσαι καθόλου  keycodes κλπ

<input type="number" id="decimals" step="0.01" min="0.01">

var currentval = 0;
$("#decimals").on('keypress', function (e) {
    currentval = $(this).val();
});

$('#decimals').on('keyup', function(e) {
    var newval = Number( $(this).val());
    console.log($(this).is(":invalid"));
    if ( newval === 0 || $(this).is(":invalid") ) {
         $(this).val(currentval);   
    }
});

http://jsfiddle.net/andreasloukakis/fvo9xwhn/

 

Δουλεύει όπου το κοίταξα λίγο πρόχειρα αλλά καλό θα ήταν να τσεκάρεις συμπεριφορές σε διάφορους browser, γιατί δεν είμαι καθόλου σίγουρος ότι θα έχουν ίδια συμπεριφορά.

Δημοσ.

Κανένα από τα δύο δε δουλεύει σωστά.

 

Βασικά τη λύση του @kalogeros δεν μπόρεσα να την κάνω να δουλέψει.

 

@alou κατάφερα και έγραψα αυτό στη δική σου περίπτωση 1912,23444555559.

Αν κρατάς πατημένο το κουμπί γράφει κανονικά και σταματάει μόλις το αφήσεις... αλλά και πάλι δεν εμπιστεύομαι πλήρω της html5 ακόμα :P

 

@leukonas μάλλον είναι πολύ υπερβολικό να κάτσω να μάθω πως δουλεύει ένα ολόκληρω script γιατί πιστεύω ότι είναι κάπως απλό αυτό που θέλω απλά κάτι μας διαφεύγει και δεν ξέρω τι :D

 

Ευχαριστώ για τον χρόνο σας!

Αν έχετε κάτι άλλο να προτείνετε εδώ είμαι :)

  • Like 1
Δημοσ.

ΟΚ αυτό λύνεται εύκολα, αν το doctype σου είναι html5 δες Link.png Site: τι υποστήριξη υπάρχει και αποφασίζεις τι σε ενδιαφέρει.

var currentval = 0,
    allowed = true;
$("#decimals").on('keydown', function (e) {
    if (!allowed) { 
        e.preventDefault();
        return;
    }
    allowed = false;
    currentval = $(this).val();    
});

$('#decimals').on('keyup', function(e) {
    allowed = true;
    var newval = Number( $(this).val());
    console.log($(this).is(":invalid"));
    if ( newval === 0 || $(this).is(":invalid") ) {
         $(this).val(currentval);   
    }
});

http://jsfiddle.net/andreasloukakis/wtk6g5hq/

Δημοσ. (επεξεργασμένο)

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

Επειδή μέχρι και σήμερα έχω δει κάποιους να χρησιμοποιούν αρχαίους browser, για αυτό δε θέλω την html5 αν και η άτιμη έχει γίνει τρελό εργαλείο!

 

Να εξηγήσω ακόμη μία φορά τι θέλω να κάνω ακριβώς.

 

Όταν φτάνουμε σε δύο δεκαδικά να μη μπορεί να προσθέσει ο χρήστης άλλο αριθμό ή γενικότερα κάτι στο input αλλά να μπορεί να χρημοποιηθεί το delete και το backspace για διαγραφή ώστε να διορθωθεί ο αριθμός κτλ.

Στο εν λόγω input box εν συνεχεία θα τρέχει και άλλος κώδικας απλά τώρα κάνω δοκιμές μόνο με αυτό το κομμάτι γιατί όλα τα υπόλοιπα τα έχω κάνει (ή έτσι νομίζω :P)

 

 

if(Number($(this).val())%0.01 > 0){
    event.preventDefault();
}

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

Επεξ/σία από rafinos
Δημοσ.

Υπόλοιπο δεν θα έπρεπε να παίρνεις, βγαίνει από γνωστό σφάλμα mapping του 0.1 σε binary. (btw, μια σκέψη που πρότεινε ο Crockford)

 

Αν το κάνεις έτσι που αριθμητικά είναι το ίδιο πράγμα, θα δεις ότι είναι σωστό

(Number( $(this).val() ) * 100) % 1

Έτσι και αλλιώς, αυτό θα μπορούσες όμως να το χρησιμοποιήσεις σε keyup event, που θα υπάρχει όλη η τιμή του input και όχι στο keydown. Γι'αυτό είχα ξεκινήσει τη διαδικασία με το διπλό event παραπάνω, αφού δεν σου κάνει, αναγκαστικά πας σε μια παρόμοια με αυτή λύση:



    $("#decimals").keydown(function (e) {
        // arrows, backspace: απλά τα δέχεσαι και επιστρέφεις - βάζεις αν θες εδώ και delete ή κάτι άλλο
        if ( $.inArray(e.keyCode, [37,38,39,40, 8]) !== -1 ) {
            return;
            //numbers or dot
        } else if ( (e.keyCode < 58 && e.keyCode > 47) || e.keyCode === 190 ) {
            var prevVal = $('#decimals').val();
            //an den iparxei teleia apo prin, de mas noiazei kati
            if (prevVal.indexOf('.') === -1) { 
                return; 
            } else {
                if (e.keyCode === 190) {
                    //iparxei idi dot, den to 8eloume
                    e.preventDefault();
                } else {
                    //menei na tsekaroume an exoume idi 2 dekadika
                    var valParts = prevVal.split('.');
                    if (valParts[1].length > 1) {
                     e.preventDefault();   
                    }
                }
            }
            
        } else {
            e.preventDefault();
        }
    });

http://jsfiddle.net/j3Lx9q4z/

Δημοσ.

Ευχαριστώ πάρα πολύ!

Δουλεύει όπως το θέλω απλά μια ερώτηση!

Τα νούμερα του numpad από αυτά του qwerty έχουν διαφορετικό keycode γιατί μπορώ να γράψω μόνο με αυτά του qwerty (ελπίζω να καταλάβατε τι είπα :P)

 

Εσύ χρησιμοποιείς την αριστερή στήλη που λέει keycodes οπότε ναι έχουν διαφορετικό code :P

http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00000520.html

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...