Chrome自动格式输入=数字


70

我有一个Web应用程序,其中使用HTML5属性type =“ number”将输入字段指定为数字。

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

通过指定类型,Chrome会自动将值格式化为包含逗号(123,456)的格式。在其他浏览器中,它不会格式化数字,但也不会阻止非数字字符。

在这种情况下,我不希望添加逗号。有什么办法可以关闭本地化格式?


2
我知道我可以将类型保留为文本,并使用JS来强制字符类型。但是,我在移动应用程序中使用此功能,并希望键盘默认为数字键盘布局。
多诺万·伍德赛德

2
您看到哪个逗号的Chrome版本?我在我的版本中看不到它。
罗伯茨2011年

@Donvan:我也使用crome但不包括逗号吗?我在我的版本中也看不到它。
Sujeet

我在11.0.696.25 Beta中看到逗号
Joe

请确保不要将chrome用作您的移动浏览器= P
David Houde

Answers:


92

发生这种情况是由于与numberChromium中的HTML5输入类型相关联的行为,并且您绝对不是唯一不在乎此的人。

过去,我使用text类型来解决此问题。例如,此方法运行良好(刚刚在Chrome 11.0.696.71中进行了测试):

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

这种number类型的行为(至少对我来说)绝对是一个错误,因为HTML5标准指定number格式化以显示时应具有以下值:

给定数字输入,将数字转换为字符串的算法如下:返回表示输入的有效浮点数。

该标准在此处定义了一个“有效的浮点数” ,据我所知,不希望包含分组字符。


更新资料

我已将问题隔离到WebKit内的以下代码中。我在此处也包含了可解决此问题的行:

// 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());
}

我下周要放假,但计划返回时将此补丁提交给WebKit团队。一旦他们(希望)接受了补丁,Chromium应该将其拉进来作为其正常刷新过程的一部分。


你可以看到原来的代码在这里,该补丁的版本在这里,和原文件的差异和补丁的文件在这里。最终补丁是由Shinaka Kawanaka创建的。


可行,但不是理想的解决方案,因为您丢失了上/下箭头。到目前为止,仍然是我找到的最好的方法。
2011年

3
@ njak32同意。不得不避免number使用Chrome浏览器是一种痛苦。希望这个问题能尽快解决。
阿坎

1
我已经制作了一个修复程序,可以纠正Chromium中的此问题,但实际的问题在WebKit代码中。我将于6/13休假返回时将其提交到WebKit项目。
arcain 2011年

1
帕特里克(Patrick)输入的Webkit错误62939!谢谢!
arcain 2011年

28
+1不仅可以回答问题,还可以花一些时间来实际修复导致该错误的软件!
DA。

5

您可以检查几个额外的属性,包括valueAsNumber

Chrome会尝试根据输入类型为您提供最佳输入法。在这种情况下,数字还具有一些额外的功能,例如上下切换。

关键是,如果数字无效,您将能够检测到错误并设置样式 input[type=number]:invalid { background-color: red; }


1
我很感激这个答案是2.5年前写的,但是想分享一下我刚刚在Chrome 31.0.1650.63中对此进行了测试的经验,该valueAsNumber属性不是必需的,可以省略。
马丁·乔纳

5

你可以尝试...

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

它将在桌面版Firefox 4和iPhone上强制输入0-9。我手边没有Chrome可以尝试使用,但应该也可以使用。


它做同样的事情。逗号,逗号,逗号。
多诺万·伍德赛德

1
@DonovanWoodside:它不会在IOS上添加逗号。
T. Junghans,2012年

3

Number是新的HTML5输入类型之一。这些内容很多-电子邮件,日期,时间,URL等。但是,我认为到目前为止,只有Chrome浏览器才实现了它们。其他的则使用默认类型(文本)。

有关HTML5输入类型的更多信息:http : //diveintohtml5.ep.io/forms.html

如果要在Chrome上禁用它,则可以保留文本,如果用户设备是掌上电脑,则可以将其更改为数字。如果用户设备嗅探给出错误的结果,这不是可用性杀手,那么您应该不会有任何问题。


4
我希望浏览器以某种方式允许我通过HTML来控制数字格式,而不是要求用户禁用它。我需要一个数字字段,但不设置格式,以便台式机和移动设备都可以具有相同的体验。照原样,我正在测试的移动设备通过默认为适当的键盘布局可以很好地处理它。桌面上的Chrome(开发者频道)按照我最初发布的方式来调整UI。
多诺万·伍德赛德

@Donovan如何使用JavaScript并取消数字以外的其他按键事件?或者,允许按下它们,但在输入框旁边显示错误。
丹·布拉斯

1
我已经连接了只允许数字的脚本,但是将输入设置为type =“ number”的主要原因是,移动键盘(iPad / iPhone / etc)的默认键盘为数字。这样,用户不必点击数字布局按钮。这只是为了方便。
多诺万·伍德赛德


1

这是可插入html输入标签的“ pattern”属性的正则表达式的完整列表:HTML5模式

这是我使用模式来格式化两位小数点的方式:

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

不幸的是,它似乎在iPad上无法正常工作。


1

尝试这个:

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

0

您为什么要禁用本地化格式?如果要使用其他格式,只需更改PC的本地化设置。用户为什么希望以其本地格式显示数字?这绝对不是Chrome中的错误,而是一项功能!

在我看来,您并不是真正使用“数字”作为输入,而是使用带有模式的“文本”代码。有关其他建议,请参见其他帖子。


6
原因有很多。例如,当输入类型为数字时,4位数的年份字段(例如2013)变为2,013!逻辑在哪里?
LDJ

1
如果它仍然是本地的,更少的人会抱怨。除了年份,邮政编码,信用卡的明显格式错误外,您仍在处理将这些逗号发送到服务器的问题!它不是本地的
henryaaron 2014年

2
@LDJ你不应该使用type=number的一年,我们有<input type=year>针对
无尽的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.