2013-05-19 9 views
17

Ich versuche eine Zahleneingabe zu machen. Ich habe gemacht, so meine Textbox Zahlen nur über diesen Code akzeptiert:Leerzeichen zwischen Zahlen hinzufügen?

function isNumber(evt) { 
    evt = (evt) ? evt : window.event; 
    var charCode = (evt.which) ? evt.which : evt.keyCode; 
    if (charCode > 31 && (charCode < 48 || charCode > 57)) { 
     return false; 
    } 
    return true; 
} 

Aber jetzt kommt die Frage auf, wie würde ich schaffen Räume wie der Benutzer in ihrer Zahl ist die Eingabe, ähnlich wie die Telefon Abstand Sache iPhone, aber mit Zahlen zum Beispiel, wenn sie eingeben: 1000 wird es 1 000 werden;

1 
10 
100 
1 000 
10 000 
100 000 
1 000 000 
10 000 000 
100 000 000 
1 000 000 000 

Etc ...

Ich habe versucht, die Eingabe von rechts für je 3 Zeichen zu lesen und ein Leerzeichen. Aber mein Weg ist ineffizient und wenn ich den Wert von 1000 auf 1 000 in der Textbox ändere, wählt er es aus irgendeinem Grund aus und drückt danach alle Tasten, löscht das Ganze.

Wenn Sie wissen, wie dies zu tun ist, verwenden Sie bitte Javascript Plugins wie jQuery. Danke.

+1

Ein Wort der Warnung: Dies ist wirklich schwierig, richtig zu bekommen. Was passiert, wenn ich mit der Maus in die Mitte der Eingabe klicke und eine Ziffer hinzufüge? Was ich den Cursor irgendwo bewegen und Paste drücken? Wie gut wird es mit Undo und Redo funktionieren? Die Verarbeitung von Tastatureingaben ist viel mehr als nur das Akzeptieren einer korrekten Zeichenfolge. – RichieHindle

Antwort

40

Für ganze Zahlen

function numberWithSpaces(x) { 
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " "); 
} 

Für Gleitkommazahlen verwenden, können Sie

function numberWithSpaces(x) { 
    var parts = x.toString().split("."); 
    parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, " "); 
    return parts.join("."); 
} 

verwenden Dies ist eine einfache regex Arbeit. https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions < < Weitere Informationen zu Regex finden Sie hier.

Wenn Sie nicht sicher sind, ob die Zahl integer sein würde oder schweben, nur 2. ein verwenden ...

18

Der einfachste Weg:

var num = 1234567890, 
result = num.toLocaleString() ;// result will equal to "1 234 567 890" 
var num = 1234567.890, 
result = num.toLocaleString() + num.toString().slice(num.toString().indexOf('.')) // will equal to 1 234 567.890 
var num = 1234567.890123, 
result = Number(num.toFixed(0)).toLocaleString() + '.' + Number(num.toString().slice(num.toString().indexOf('.')+1)).toLocaleString() 
//will equal to 1 234 567.890 123 

Wenn Sie wollen '' statt ' ‚:

var num = 1234567.890123, 
result = Number(num.toFixed(0)).toLocaleString().split(/\s/).join(',') + '.' + Number(num.toString().slice(num.toString().indexOf('.')+1)).toLocaleString() 
//will equal to 1,234,567.890 123 

Wenn nicht funktioniert, setzen Sie die Parameter wie: "toLocaleString ('ru-RU')" Parameter" de-DE ", teilt die Nummer durch die", "anstelle von"

+0

großartige Lösung! – ChangeTheWay

+0

saubere Antwort! Vielen Dank! –