我有一个 Web 应用程序,我在其中使用 HTML5 属性 type="number" 将输入字段指定为数字。
<input type="number" value="123456" />
通过指定类型,Chrome 会自动将值格式化为包含逗号 (123,456)。在其他浏览器中,它不会格式化数字,但也不会阻止非数字字符。
在这种情况下,我不希望添加逗号。有什么办法可以关闭本地化格式?
这是由于与 Chromium 中的 HTML5 number
输入类型相关的行为而发生的,而您肯定是 not the only one 不关心这一点。
我过去曾使用 text
类型解决过这个问题。例如,这运行良好(刚刚在 Chrome 11.0.696.71 中测试过):
<input type="text"
placeholder="Enter Text"
name="inputName"
pattern="[0-9]*">
number
类型的这种行为(至少对我而言)绝对是一个错误,因为 HTML5 standard 指定 number
在格式化显示时应具有以下值:
给定数字输入,将数字转换为字符串的算法如下: 返回表示输入的有效浮点数。
并且该标准定义了一个“有效浮点”数here,据我所知,不包括分组字符。
更新
我已将问题隔离到 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 创建。
您可以检查几个额外的属性,包括 valueAsNumber
。
Chrome 会尝试根据输入类型为您提供最佳的输入法。在这种情况下,数字还具有一些额外的功能,例如上下切换。
重点是,如果数字无效,您将能够检测到存在错误并设置样式 input[type=number]:invalid { background-color: red; }
valueAsNumber
属性不是必需的,可以省略。
你可以试试...
<input type="text" pattern="[0-9]*" value="123456" />
这将在桌面上的 Firefox 4 和 iPhone 上强制输入 0-9;我手头没有 Chrome 可以试一试,但它也应该这样做。
Number 是新的 HTML5 输入类型之一。有很多这些 - 电子邮件、日期、时间、网址等。但是,我认为到目前为止只有 Chrome 实现了它们。其他人回退到使用默认类型(文本)。
有关 HTML5 输入类型的详细信息:http://diveintohtml5.ep.io/forms.html
如果您想在 Chrome 上禁用它,如果用户设备是手持设备,您可以保留文本并将其更改为数字。如果用户设备嗅探给出错误的结果,这不是可用性杀手,因此您不应该有任何问题。
请参阅我对 this similar question 的回答。
我相信使用 <input type="tel" />
是目前避免这个陷阱最合乎逻辑的。其他选项对我来说很有趣并且有点新(例如 pattern
属性),但我发现它们对我的设计并不满意。您可以查看我不久前为希尔顿完成的移动应用程序的屏幕截图here(它实际上显示在我第一次引用的答案中)。
以下是您可以插入到 html 输入标记的“模式”属性中的正则表达式的完整列表:HTML5 Pattern
以下是我如何使用模式来格式化小数点后两位:
<input type="number" pattern="\d+(\.\d{2})?" />
不幸的是,它在 iPad 上似乎不太正常。
尝试这个:
if (navigator.userAgent.toLowerCase().indexOf("chrome") >= 0) {
$('[type=number]').attr('type', 'text').attr('pattern', '[0-9]*');
}
为什么要禁用本地化格式?如果您想要不同的格式,只需更改 PC 的本地化设置。为什么用户不感兴趣以他或她的本地格式显示数字?这绝对不是 Chrome 中的错误,而是一项功能!
在我看来,您并没有真正使用“数字”作为输入,而是使用带有模式的“文本”代码。有关建议,请参阅其他帖子。
type=number
一年,我们有 <input type=year>
number
很痛苦;希望问题能很快得到解决。