Chrome Auto Formate Eingabe = Nummer

70

Ich habe eine Webanwendung, in der ich ein Eingabefeld als Zahl mit der HTML5-Eigenschaft type = "number" spezifiziere.

<input type="number" value="123456" />

Durch Angabe des Typs formatiert Chrome den Wert automatisch so, dass er ein Komma enthält (123.456). In anderen Browsern wird die Nummer nicht formatiert, aber auch nicht numerische Zeichen werden nicht verhindert.

In diesem Fall möchte ich nicht, dass das Komma hinzugefügt wird. Gibt es eine Möglichkeit, die lokalisierte Formatierung zu deaktivieren?

Donovan Woodside
quelle
2
Ich weiß, dass ich den Typ als Text belassen und JS verwenden kann, um die Zeichentypen zu erzwingen. Ich verwende dies jedoch in einer mobilen App und möchte, dass die Tastatur standardmäßig das Zifferntastaturlayout verwendet.
Donovan Woodside
2
In welcher Chrome-Version wird dieses Komma angezeigt? Ich sehe es nicht in meiner Version.
Robertc
@ Donvan: Ich benutze Crome auch, aber Komma ist nicht enthalten? Ich sehe es auch nicht in meiner Version.
Sujeet
Ich sehe das Komma in 11.0.696.25 Beta
Joe Lencioni
Stellen Sie nur sicher, dass Sie Chrome nicht als mobilen Browser verwenden = P
David Houde

Antworten:

92

Dies liegt an dem Verhalten, das mit dem HTML5- numberEingabetyp in Chromium verbunden ist, und Sie sind definitiv nicht der einzige , der sich nicht darum kümmert.

Ich habe dieses Problem in der Vergangenheit mithilfe des textTyps umgangen. Dies hat beispielsweise gut funktioniert (wurde gerade in Chrome 11.0.696.71 getestet):

<input type="text" 
       placeholder="Enter Text" 
       name="inputName" 
       pattern="[0-9]*">

Dieses Verhalten des numberTyps (zumindest für mich) ist definitiv ein Fehler, da der HTML5-Standard angibt, numberdass der Wert bei der Formatierung für die Anzeige den folgenden Wert haben soll:

Der Algorithmus zum Konvertieren einer Zahl in eine Zeichenfolge bei einer eingegebenen Zahl lautet wie folgt: Gibt eine gültige Gleitkommazahl zurück, die die Eingabe darstellt.

Und der Standard definiert eine „gültige Gleitkomma“ Nummer hier , und soweit ich sehen kann, einschließlich Gruppierungszeichens ist nicht zu erwarten.


Aktualisieren

Ich habe das Problem auf den folgenden Code in den Eingeweiden von WebKit beschränkt. Ich habe auch hier die Zeile eingefügt, die das Problem behebt:

// From LocalizedNumberICU.cpp
String formatLocalizedNumber(double number, unsigned fractionDigits)
{
    NumberFormat* formatter = numberFormatter();
    if (!formatter)
        return String();
    UnicodeString result;
    formatter->setMaximumFractionDigits(clampToInteger(fractionDigits));
    formatter->setGroupingUsed(FALSE); // added this line to fix the problem
    formatter->format(number, result);
    return String(result.getBuffer(), result.length());
}

Ich bin nächste Woche im Urlaub, habe aber vor, diesen Patch nach meiner Rückkehr beim WebKit-Team einzureichen. Sobald sie (hoffentlich) den Patch akzeptiert haben, sollte Chromium ihn als Teil seines normalen Aktualisierungsprozesses einspielen.


Sie können den Originalcode hier , die gepatchte Revision hier und den Unterschied zwischen der Originaldatei und der gepatchten Datei hier sehen . Der letzte Patch wurde von Shinya Kawanaka erstellt.

Arcain
quelle
Funktioniert, ist aber nicht die ideale Lösung, da Sie die Aufwärts- / Abwärtspfeile verlieren. Immer noch die beste Methode, die ich bisher gefunden habe.
ajnatural
3
@ njak32 Einverstanden. numberIn Chrome vermeiden zu müssen, ist ein Schmerz. Ich hoffe, das Problem ist schnell behoben.
Arcain
1
Ich habe einen Fix erstellt, der dieses Problem in Chromium behebt, aber das eigentliche Problem liegt im WebKit-Code. Ich werde es an das WebKit-Projekt senden, wenn ich am 13.06. Aus dem Urlaub zurückkomme.
Arcain
1
Webkit-Fehler 62939 von Patrick eingegeben! Vielen Dank!
Arcain
28
+1, um nicht nur die Frage zu beantworten, sondern sich auch die Zeit zu nehmen, um die Software zu reparieren, die den Fehler verursacht!
DA.
5

Es gibt einige zusätzliche Eigenschaften, die Sie überprüfen können, einschließlich valueAsNumber.

Chrome versucht, Ihnen basierend auf dem Eingabetyp die bestmögliche Eingabemethode bereitzustellen. In diesem Fall hat die Zahl auch einige zusätzliche Fähigkeiten wie das Umschalten nach oben und unten.

Wenn die Nummer nicht gültig ist, können Sie Fehler erkennen und das Styling festlegen input[type=number]:invalid { background-color: red; }

Kinlan
quelle
1
Ich schätze, dass diese Antwort vor 2,5 Jahren geschrieben wurde, wollte aber meine Erfahrung teilen, dass ich dies gerade in Chrome 31.0.1650.63 getestet habe und die valueAsNumberEigenschaft nicht erforderlich ist und weggelassen werden kann.
Martin Joiner
5

Du könntest es versuchen ...

<input type="text" pattern="[0-9]*" value="123456" />

Dadurch wird die Eingabe von 0-9 in Firefox 4 auf dem Desktop sowie auf einem iPhone erzwungen. Ich habe Chrome nicht zur Hand, um es anzuprobieren, aber es sollte dasselbe tun.

gdt
quelle
Es macht das Gleiche. Kommas, Kommas, Kommas.
Donovan Woodside
1
@ DonovanWoodside: Auf IOS werden keine Kommas hinzugefügt.
T. Junghans
3

Number ist einer der neuen HTML5-Eingabetypen. Es gibt viele davon - E-Mail, Datum, Uhrzeit, URL usw. Ich denke jedoch, dass bisher nur Chrome sie implementiert hat. Die anderen verwenden wieder den Standardtyp (Text).

Weitere Informationen zu HTML5-Eingabetypen: http://diveintohtml5.ep.io/forms.html

Wenn Sie es in Chrome deaktivieren möchten, können Sie es als Text belassen und in Nummer ändern, wenn das Benutzergerät ein Handheld ist. Da es kein Usability-Killer ist, wenn das Schnüffeln des Benutzergeräts das falsche Ergebnis liefert, sollten Sie keine Probleme haben.

Dan bläst
quelle
4
Ich würde es vorziehen, wenn der Browser es mir irgendwie ermöglicht, zu steuern, wie die Nummer über HTML formatiert wird, anstatt dass der Benutzer sie deaktivieren muss. Ich möchte ein numerisches Feld, aber ohne Formatierung, damit sowohl Desktop- als auch Mobilgeräte die gleiche Erfahrung machen können. Die mobilen Geräte, mit denen ich teste, handhaben dies gut, indem sie standardmäßig das entsprechende Tastaturlayout verwenden. Chrome (Entwicklerkanal) auf dem Desktop optimiert die Benutzeroberfläche auf die Art und Weise, über die ich ursprünglich geschrieben habe.
Donovan Woodside
@Donovan Was ist mit der Verwendung von JavaScript und dem Abbrechen von Tastendruckereignissen für andere als Zahlen? Alternativ können Sie sie drücken lassen, aber neben dem Eingabefeld einen Fehler anzeigen.
Dan Blows
1
Ich habe bereits ein Skript verkabelt, das nur Zahlen zulässt, aber der Hauptgrund, warum ich die Eingabe auf type = "number" gesetzt habe, ist, dass die mobile Tastatur (iPad / iPhone / etc) standardmäßig eine mit Zahlen verwendet. Auf diese Weise muss der Benutzer nicht auf die Schaltfläche für das Nummernlayout tippen. Es ist nur eine Frage der Bequemlichkeit.
Donovan Woodside
2

Beziehen Sie sich auf meine Antwort für diese ähnliche Frage .

Ich glaube, dass die Verwendung <input type="tel" />am logischsten ist, um diese Gefahr derzeit zu vermeiden. Die anderen Optionen sind faszinierend und für mich etwas neu (wie das patternAttribut), aber ich fand sie für mein Design unbefriedigend. Sie kann ich vor für Hilton nicht zu lange vervollständigen zu einem Screenshot einer mobilen Anwendung aussehen hier (es ist tatsächlich in der Antwort gezeigt ich zuerst verwiesen).

Gabriel Ryan Nahmias
quelle
1

Hier ist eine ganze Liste regulärer Ausdrücke, die Sie in das Attribut "pattern" des HTML-Eingabe-Tags einfügen können : HTML5 Pattern

So verwende ich ein Muster, um die zwei Dezimalstellen zu formatieren:

<input type="number" pattern="\d+(\.\d{2})?" />

Leider scheint es auf dem iPad nicht ganz richtig zu funktionieren.

Hoekma
quelle
1

Versuche dies:

if (navigator.userAgent.toLowerCase().indexOf("chrome") >= 0) {
    $('[type=number]').attr('type', 'text').attr('pattern', '[0-9]*');
}
Tiriana
quelle
0

Warum sollten Sie die lokalisierte Formatierung deaktivieren? Wenn Sie ein anderes Format wünschen, ändern Sie einfach die Lokalisierungseinstellungen Ihres PCs. Warum sollte ein Benutzer nicht daran interessiert sein, eine Nummer in seinem lokalen Format anzuzeigen? Dies ist definitiv kein Fehler in Chrome, sondern eine Funktion!

Mir scheint, Sie verwenden nicht wirklich eine "Zahl" als Eingabe, sondern einen "Text" -Code mit einem Muster. In den anderen Beiträgen finden Sie Vorschläge dazu.

Aristoteles
quelle
6
Es gibt viele Gründe. Zum Beispiel wird ein 4-stelliges Jahresfeld (z. B. 2013) zu 2.013, wenn der Eingabetyp Nummer ist! Wo ist die Logik darin?
LDJ
1
Wenn es lokal bleiben würde, würden sich weniger Menschen beschweren. Abgesehen von der offensichtlichen Fehlformatierung von Jahren, Postleitzahlen und Kreditkarten haben Sie es immer noch mit diesen Kommas zu tun, die an den Server gesendet werden! Es ist nicht lokal
Henryaaron
2
@LDJ sollten Sie nicht type=numberfür Jahr verwenden, wir haben <input type=year>dafür
Endless