输入类型号的本地化

IT技术 javascript html localization
2021-01-29 01:43:55

我在 Chrome 中运行的 Web 应用程序上工作,其中输入类型为number在我的语言环境中,逗号用于十进制数,空格用于分隔千位(不是那么重要),但是当我将这些字符输入到数字字段中时,它们会被简单地删除,从而有效地将金额增加了一百。

我在浏览器设置和页面上都设置了语言,但我仍然需要使用句点作为小数点。有什么办法可以将字段配置为接受逗号吗?

或者,我必须使用 javascript 来解决这个问题。我想我可以处理 keydown 事件并在用户键入时将逗号更改为句点,但这不会提供很好的用户体验,不是吗?那么我怎样才能以最少的代码实现这一点呢?

5个回答

input type=number由于定义和实现,HTML5从本地化的角度来看是不够的。它旨在本地化,但根据浏览器的区域设置,您无法设置,甚至无法作为设计者/作者知道。

在我的 Chrome 上,input type=number step=0.001接受 1,2(带逗号)并将其作为 1.2 发送,并接受 1.200(带句点),明显地将其转换为 1200 并按原样发送。当浏览器语言环境为芬兰语时,这或多或少就是这样。但它无法接受 1 200(这是芬兰语中写 1200 的标准方式),而是只发送数字 1。

所以比较没希望。使用您能找到的任何 JavaScript 小部件,或一个简单的文本输入框。input type=number除非所有用户都使用具有相同语言环境的浏览器并对数字格式有相同的期望,否则任何事情都可能更好

如果您不需要向上/向下刻度,那么遵循解决方法可以提供帮助:

仅用于逗号 (,)(如德语语法):

<input type="text" pattern="[0-9]+([,][0-9]{1,2})?" name="amount">

仅点 (.):

<input type="text" pattern="[0-9]+([\.][0-9]{1,2})?" name="amount">

两者都不要在一起:(没有 1000 分隔符)

<input type="text" pattern="[0-9]+([\.|,][0-9]{1,2})?" name="amount">

否则德语/德语的数字:

<input name="myinput" value="0" step="0.01" lang="de-DE" type="number">

并使用以下样式对其进行样式设置:

input[type=number] {
    -moz-appearance:textfield;
    -webkit-appearance: none;
    appearance: textfield;
}

此外 lang "global" 属性可以改变所有没有自己的 lang 属性的输入元素的行为 (thx @florian):

<html lang="en">

看:

有效的 lang 值列表:https : //github.com/libyal/libfwnt/wiki/Language-Code-identifiers

也因为 lang-attribute 而投票 - 我也遇到了我无法直接在输入字段上设置属性的问题...当您在 html-tag 上设置 lang-attribute 时它也有效
2021-03-25 01:43:55
我与 OP 处于相同的情况,我个人发现 Frank 的回答中的属性:lang="de-DE"(或其他文化)正是我所需要的。弗兰克在这里的回答应该有更多的赞成票,因为它是一个可行的解决方案,而且非常简单。
2021-03-26 01:43:55
仅德语逗号看起来还可以,但是..你是怎么发帖的?因为张贴的value应该是特定于文化的。
2021-03-28 01:43:55
“lang”属性在基于 Chromium 的浏览器上根本不起作用
2021-03-31 01:43:55
另请注意,在移动设备上,input type="number" 的控件可能看起来不同(数字键盘),并且您不会获得 type="text" 的额外控件。另见blog.pamelafox.org/2012/05/...
2021-04-05 01:43:55

规范很明确:只允许使用句点作为小数点分隔符。由浏览器来为表单提供本地化支持不允许使用千位分隔符。

不错的博客文章 :) 我看到自从我发布问题以来,这方面已经有了一些发展。
2021-03-15 01:43:55
2021-03-25 01:43:55

不幸的是,这些字符在 <input type="number">

请参阅此处的规格:http : //w3c.github.io/html-reference/datatypes.html#common.data.float-def

这是您想要的格式吗?http://jsfiddle.net/S8rqY/

如果标签的属性允许整数以外的数字,则接受小数分隔符,例如<input type="number" step="0.1">.
2021-03-16 01:43:55
是的,您是对的,就像您在答案中解释得很好一样,允许的字符将取决于浏览器的区域设置,小数点分隔符或千位分隔符会相应地更改。
2021-03-16 01:43:55
@Jørgen 严格并避免管道字符。此外,您也应该允许一个数字。-?\d+(,\d{1,2})?
2021-03-24 01:43:55
有点,尽管我需要将模式更改-?\d+(|,\d{2})?为包含负数:)
2021-03-25 01:43:55
不客气,希望有帮助。
2021-03-25 01:43:55

Chrome 使用浏览器设置,而 Firefox 不使用。至少并非总是如此——例如,当<html>标签中有 lang 属性时,Firefox 会使用它。

但是,您也可以将 lang 属性<input>直接传递给标签。将其与 Navigator API 结合可以模拟 Chromes 行为。

React 中的最小示例:

<input
  type="number"
  lang={navigator.language}
/>