如何使用 html5 输入类型号处理浮点数和小数点分隔符

IT技术 javascript jquery mobile floating-point html-input
2021-01-28 15:20:35

我正在构建主要用于移动浏览器的网络应用程序。我使用数字类型的输入字段,因此(大多数)移动浏览器仅调用数字键盘以获得更好的用户体验。这个网络应用程序主要用于小数点分隔符是逗号而不是点的区域,所以我需要处理这两个小数点分隔符。

如何用点和逗号覆盖整个混乱?

我的发现:

桌面版 Chrome

  • 输入类型=数字
  • 用户输入“4,55”到输入字段
  • $("#my_input").val(); 返回“455”
  • 我无法从输入中获得正确的值

桌面版火狐

  • 输入类型=数字
  • 用户输入“4,55”到输入字段
  • $("#my_input").val(); 返回“4,55”
  • 没关系,我可以用点替换逗号并获得正确的浮点数

安卓浏览器

  • 输入类型=数字
  • 用户输入“4,55”到输入字段
  • 当输入失去焦点时,值被截断为“4”
  • 混淆用户

视窗电话 8

  • 输入类型=数字
  • 用户输入“4,55”到输入字段
  • $("#my_input").val(); 返回“4,55”
  • 没关系,我可以用点替换逗号并获得正确的浮点数

在这种情况下,当用户可能使用逗号或点作为小数点分隔符并且我想将 html 输入类型保留为数字以提供更好的用户体验时,“最佳实践”是什么?

我可以将逗号转换为“动态”的点,绑定关键事件,它是否适用于数字输入?

编辑

Currenlty 我没有任何解决方案,如何从类型设置为数字的输入中获取浮点值(作为字符串或数字)。如果最终用户输入“4,55”,Chrome 总是返回“455”,Firefox 返回“4,55”,这很好。

同样令人讨厌的是,在 Android(测试 4.2 模拟器)中,当我在输入字段中输入“4,55”并将焦点更改为其他位置时,输入的数字被截断为“4”。

6个回答

我认为上面的答案中缺少的是需要为step属性指定不同的值,该属性的默认值为1. 如果您希望输入的验证算法允许浮点值,请相应地指定一个步骤。

例如,我想要美元金额,所以我指定了这样的步骤:

 <input type="number" name="price"
           pattern="[0-9]+([\.,][0-9]+)?" step="0.01"
            title="This should be a number with up to 2 decimal places.">

使用 jQuery 检索值并没有错,但是您会发现直接使用 DOM API 来获取元素的validity.valid属性很有用

我对小数点有类似的问题,但我意识到存在问题的原因是 Twitter Bootstrap 添加到具有无效值的数字输入的样式。

这是一个小提琴,演示添加step属性使其工作,并测试当前值是否有效:

TL;DR: 将 astep属性设置为浮点值,因为它默认为1

注意:逗号对我无效,但我怀疑如果我将操作系统语言/区域设置设置为使用逗号作为小数点分隔符的地方,它会起作用。*注意事项*:Ubuntu/Gnome 14.04 中的操作系统语言/键盘设置 *德语* 并非如此。

如果您想允许任意多个小数位,请指定step属性 as"any"而不是 eg "0.01",如此处所示。有关演示,请参阅nathciketa 小提琴的调整版本
2021-03-21 15:20:35
就像迈克尔说的,请将 更改typetext,否则您的回答没有任何意义。
2021-03-26 15:20:35
This attribute applies when the value of the type attribute is text, search, tel, url, email, or password, otherwise it is ignored. 所以模式是无用的 type="number"
2021-03-29 15:20:35
我也遇到了逗号未验证的问题,尽管我在<input type="number" step="any">. 我一直无法找到关闭 HTML5 验证的方法。我可以关闭或自定义错误消息,但从输入中检索值总是很糟糕。有任何想法吗?
2021-04-02 15:20:35

根据 w3.org,数字输入value属性被定义为浮点数浮点数的语法似乎只接受点作为小数点分隔符。

我在下面列出了一些可能对您有帮助的选项:

1.使用pattern属性

使用pattern属性,您可以以 HTML5 兼容的方式使用正则表达式指定允许的格式。如果模式失败,您可以在此处指定允许使用逗号字符和有用的反馈消息。

<input type="number" pattern="[0-9]+([,\.][0-9]+)?" name="my-num"
           title="The number input must start with a number and use either comma or a dot as a decimal character."/>

注意:跨浏览器支持差异很大。它可能是完整的、部分的或不存在的。

2. JavaScript 验证

您可以尝试将一个简单的回调绑定到例如onchange(和/或blur)事件,该事件将替换逗号或一起验证。

3.禁用浏览器验证##

第三,您可以尝试在数字输入上使用formnovalidate属性,目的是一起禁用该字段的浏览器验证。

<input type="number" formnovalidate />

4. 组合..?

<input type="number" pattern="[0-9]+([,\.][0-9]+)?" 
           name="my-num" formnovalidate
           title="The number input must start with a number and use either comma or a dot as a decimal character."/>
看起来输入类型编号产生的问题比实际改善用户体验的问题要多。在移动设备中,如果我希望他们只输入数字,如果我只能向用户打开数字键盘,那就太好了。无论如何,我需要再次重新考虑这个......
2021-03-18 15:20:35
因为我们还需要同时支持使用点和逗号作为小数点分隔符,所以我们计划在桌面上结合 type="text" 使用模式进行验证。然后我们将添加用于检测移动设备的特征检测,并在适用时使用 type="number"。
2021-03-18 15:20:35
input.valueAsNumber - 没有帮助,因为这仅适用于点作为小数点分隔符,在我的情况下,最终用户可能使用点或逗号。 表单标签 novalidate - 尚未发现对此有任何影响。
2021-03-31 15:20:35
不幸的是,我的想法不多了,所以我不确定您是否能够在没有解决方法的情况下跨浏览器进行这项工作。我已经更新了我的答案以包含模式属性,我还发现可以直接在输入字段上使用formnovalidate属性。我知道你不会喜欢它,但如果一切都失败了并且你绝对需要逗号,那么input="text"可能是唯一的方法..
2021-04-04 15:20:35

是使用逗号还是句点作为小数点分隔符完全取决于浏览器。浏览器根据操作系统或浏览器的区域设置做出决定,或者某些浏览器从网站获取提示。我制作了一个浏览器比较图,展示了不同浏览器如何支持处理不同的本地化方法。Safari 是唯一可以交替处理逗号和句点的浏览器。

基本上,您作为网络​​作者无法真正控制这一点。一些变通方法涉及使用两个带有整数的输入字段。这允许每个用户按预期输入数据。它不是特别性感,但它适用于所有用户的所有情况。

使用valueAsNumber代替.val()

输入 。valueAsNumber [ = 值 ]

返回表示表单控件值的数字(如果适用);否则,返回 null。
可以设置,改变值。
如果控件既不是基于日期或时间也不是数字,则抛出 INVALID_STATE_ERR 异常。

似乎无法在 Windows Phone 上始终如一地工作;总是返回NaN
2021-03-30 15:20:35
@bertbruynooghe,您指定的值是什么?
2021-04-04 15:20:35
似乎不起作用,无论是“9”、“9,1”还是“9.1”。电话配置为美国,键盘布局测试 en-US、nl-BE。
2021-04-08 15:20:35
问题是他想支持逗号作为小数点分隔符,并且在输入上使用 type="number" 总是在写逗号时给出无效数字。
2021-04-11 15:20:35

使用文本类型但强制显示数字键盘

<input value="12,4" type="text" inputmode="numeric" pattern="[-+]?[0-9]*[.,]?[0-9]+">

inputmode 标签是解决方案

此外,您无法在移动设备上使用这种简洁的数字键盘。
2021-03-24 15:20:35
但它并不兼容所有浏览器,只兼容最新版本的 iOS Safari、Chrome、Chromium、Opera... caniuse.com/#feat=input-inputmode :(
2021-04-02 15:20:35