Chrome自动格式input=数字

我有一个Web应用程序,我指定一个input字段是使用HTML5属性type =“number”的数字。

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

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

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

这是由于与Chromium中的HTML5 numberinputtypes相关的行为而发生的,您绝对不是唯一不关心这一点的人。

过去我通过使用texttypes解决了这个问题。 例如,这个工作得很好(在Chrome 11.0.696.71中刚刚testing过):

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

numbertypes的行为(至less对我来说)肯定是一个错误,因为HTML5标准在格式化显示时指定的number应该具有以下值:

在给定数字input的情况下,将数字转换为string的algorithm如下所示:返回表示input的有效浮点数。

而且这个标准在这里定义了一个“有效的浮点数”的数字,就我所知,包括分组字符在内是不可预料的。


更新

我已经把这个问题隔离到了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应该将其作为正常刷新过程的一部分。


你可以在这里看到原始代码,修补版本,以及原始文件和补丁文件的区别。 最后的补丁是由Shinya Kawanaka创build的。

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

Chrome尝试根据inputtypes为您提供最佳的input方法。 在这种情况下,号码也有一些额外的能力,如上下切换。

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

你可以试试…

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

这将强制在桌面上的Firefox 4和iPhone上input0-9。 我手头没有Chrome,但它也应该这样做。

数字是新的HTML5inputtypes之一。 有很多这些 – 电子邮件,date,时间,url等。但是,我认为只有铬到目前为止已经实施。 其他人回落到使用默认types(文本)。

有关HTML5inputtypes的更多信息: http : //diveintohtml5.ep.io/forms.html

如果您想在Chrome上停用该function,则可以将其保留为文本,并在用户设备是手持设备时将其更改为数字。 由于如果用户设备嗅探给出错误的结果,它不是一个可用性杀手,你不应该有任何问题。

请参考我的回答这个类似的问题 。

我相信使用<input type="tel" />是最合乎逻辑的,可以避免当前的这个缺陷。 其他的select对我来说是有趣的,也是一些新的东西(比如pattern属性),但是我发现它们对于我的devise来说是不能令人满意的。 不久之前,您可以查看我为希尔顿完成的移动应用程序的屏幕截图(实际上显示在我第一次参考的答案中)。

尝试这个:

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

以下是正则expression式的完整列表,您可以将其插入htmlinput标记的“模式”属性: HTML5模式

下面是我如何使用模式来格式化数字的两个小数点:

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

不幸的是,它似乎并没有在iPad上正常工作。

为什么你想要禁用本地化的格式? 如果你想要一个不同的格式,只需改变你的PC的本地化设置。 为什么用户不会有兴趣以他或她的本地格式显示一个号码? 这绝对不是Chrome中的一个bug,而是一个function!

在我看来,你并不是真正使用“数字”作为input,而是使用模式的“文本”代码。 看到其他职位的build议。