ChatGPT解决这个技术问题 Extra ChatGPT

在 HTML5 数字输入中强制使用小数点而不是逗号(客户端)

我已经看到一些浏览器将数字的 input type="number" 符号本地化。

所以现在,在我的应用程序显示经度和纬度坐标的字段中,我得到了像“51,983”这样的东西,它应该是“51.982559”。我的解决方法是改用 input type="text",但我想使用正确显示小数的数字输入。

有没有办法强制浏览器在数字输入中使用小数点,而不管客户端本地设置如何?

(不用说,在我的应用程序中,无论如何我都会在服务器端纠正这个问题,但在我的设置中,我还需要它在客户端正确(因为一些 JavaScript))。

提前致谢。

更新截至目前,在 Windows 7 上检查 Chrome 版本 28.0.1500.71 m,输入的数字不接受逗号格式的小数。带有step属性的建议似乎不起作用。

http://jsfiddle.net/AsJsj/

你找到解决方案了吗?我在 Windows 上的 Chrome 11 上遇到了几乎相同的问题。
还没有解决办法。最好的猜测是避免这种情况(并使用输入类型=“文本”),直到解决这个问题……
看起来取决于您浏览器的语言环境,在我的 chrome 中我看到逗号,在我合作伙伴的 chrome 中我看到点。
正如我最近发现的那样,一些国家/地区使用逗号而不是“小数点”。

P
Peter

使用指定为所需小数精度的 step 属性和 lang 属性 [设置为使用句点格式化小数的区域设置],您的 html5 数字输入将接受小数。例如。取 10.56 之类的值;我的意思是 2 位小数,这样做:

<input type="number" step="0.01" min="0" lang="en" value="1.99">

您可以进一步为最大允许值指定 max 属性。

编辑向输入元素添加一个语言属性,其语言环境值使用点而不是逗号格式化小数


这仍然不起作用:-(客户端本地值始终将小数点转换为小数点逗号,无论步骤或值属性如何。:-(
据我了解,问题不在于使用小数分隔符。问题是关于有'。当客户端的语言环境更喜欢“,”时,而不是“,”。
无论您在 step 属性中使用什么小数分隔符 - 浏览器仍会对其进行本地化。也就是说,以您的示例为例-在大多数欧洲国家/地区,显示的数字为 10,56
5年后我回来重新阅读了这个问题,想知道为什么我提供了上面的答案。请看编辑
如果使用 ajax 保存数据,它也将不起作用。
A
Ashraf Sabry

目前,Firefox 支持输入所在的 HTML 元素的语言。例如,在 Firefox 中试试这个小提琴:

http://jsfiddle.net/ashraf_sabry_m/yzzhop75/1/

您将看到数字是阿拉伯文,逗号用作小数分隔符,阿拉伯文就是这种情况。这是因为 BODY 标记具有属性 lang="ar-EG"

接下来,试试这个:

http://jsfiddle.net/ashraf_sabry_m/yzzhop75/2/

这个以点作为小数点分隔符显示,因为输入被包裹在 DIV 中,给定属性 lang="en-US"

因此,您可能会采用的解决方案是使用容器元素包装您的数字输入,该容器元素设置为使用使用点作为小数分隔符的区域性。


有趣的!不幸的是,它似乎只适用于 Firefox,而不适用于 Chrome (47.0.2526.106)
即使不在 Firefox 中,在法国
Firefox 尊重页面的语言设置。 Chrome 强加了操作系统或浏览器的小数分隔符?无论页面、浏览器或操作系统的语言设置如何,Edge 都会强加小数点。真是一团糟。
您不需要包装器元素。您可以直接在输入元素上设置 lang 属性。
lang 属性实际上对我产生了影响,谢谢!
H
Halil Özgür

根据 spec,您可以使用 any 作为 step 属性的值:

<input type="number" step="any">

z
zian974

在输入上使用 lang 属性。我的网络应用程序 fr_FR 上的语言环境,输入数字上的 lang="en_EN",我可以无所谓地使用逗号或点。 Firefox 总是显示一个点,Chrome 显示一个逗号。但两个分隔符都是有效的。


o
opalenzuela

可悲的是,现代浏览器中此输入字段的覆盖率非常低:

http://caniuse.com/#feat=input-number

因此,我建议期待回退并依靠大量程序加载的 input[type=text] 来完成这项工作,直到该字段被普遍接受。

到目前为止,只有 Chrome、Safari 和 Opera 有一个简洁的实现,但所有其他浏览器都有 bug。其中一些,甚至似乎不支持小数(如 BB10)!


使用像 number.js 这样的库可能有助于解决这个星球上存在多种语言的固有问题。
L
Lundin

我发现一篇博客文章似乎解释了一些相关的事情:
HTML5 input type=number and decimals/floats in Chrome

总之:

该步骤有助于定义有效值的域

默认步长为 1

因此默认域是整数(在 min 和 max 之间,包括,如果给定)

我认为这与使用逗号作为千位分隔符与使用逗号作为小数点的歧义混为一谈,而您的 51,983 实际上是一个奇怪的解析五万一千九百八三。

显然您可以使用 step="any" 将域扩大到范围内的所有有理数,但是我自己没有尝试过。对于经纬度我已经成功使用:

<input name="lat" type="number" min="-90.000000" max="90.000000" step="0.000001">
<input name="lon" type="number" min="-180.000000" max="180.000000" step="0.000001">

它可能不漂亮,但它有效。


在那种情况下,我写了一个总结然后推断是件好事,嗯?
就我而言,GeolocationPosition.coords.latitude 有时会返回 float,例如 99.999999999999999。所以输入步骤将是: step="0.000000000000001" 是一个有效的 required 输入
A
Andrea Aloi

我不知道这是否有帮助,但我在搜索同样的问题时偶然发现了这里,只是从 input 的角度来看(即我注意到我的 <input type="number" /> 接受逗号和点输入值时,但只有后者被绑定到我分配给输入的 angularjs 模型)。所以我通过记下这个快速指令来解决:

.directive("replaceComma", function() {
    return {
        restrict: "A",
        link: function(scope, element) {
            element.on("keydown", function(e) {
                if(e.keyCode === 188) {
                    this.value += ".";
                    e.preventDefault();
                }
            });
        }
    };
});

然后,在我的 html 中,只需:<input type="number" ng-model="foo" replace-comma /> 将用点替换逗号,以防止用户输入无效(从 javascript 的角度来看,而不是语言环境!)数字。干杯。


嗨 Andrea,没有 Angular JS 有没有办法做到这一点?以 jQuery 为例?
当然,我想您可以在每个数字输入的基础上编写类似 $("input[type=number]").on("keydown", function(e) { if(e.keyCode === 188) { this.value += "."; e.preventDefault(); }}); 的内容(一旦您的页面与所有数字输入一起完全加载)
此代码段不适用于 chrome(使用 v60 测试)。键入 888, 时,设置 value 属性会引发警告,指出 888. 不是有效数字(正则表达式要求点后至少有一个数字)并将该字段留空。输入一个点虽然有效,可能是因为输入认为它的值“正在进行中”并等待输入更多数字
E
Ed Chapel

据我了解,HTML5 input type="number 始终将 input.value 作为 string 返回。

显然,input.valueAsNumber 将当前值作为浮点数返回。您可以使用它来返回您想要的值。

请参阅http://diveintohtml5.info/forms.html#type-number


谢谢,这可能有用!
有趣的是 input.value 实际上返回了一个带有点的规范数字,尽管它显示为一个昏迷。生活在欧洲第三世界国家真是太糟糕了……
m
mhrvatin

您是否考虑过为此使用Javascript?

$('input').val($('input').val().replace(',', '.'));


在带有 input[type = number] 的 chrome 上不起作用.. 始终显示逗号。
j
jbutler483

一个选项是 javascript parseFloat()...永远不要解析带有指向 int 的 "text chain" --> 12.3456...123456 (int remove the point) 将文本链解析为 FLOAT...

将此坐标发送到服务器执行此发送文本链。 HTTP 只发送 TEXT

在客户端中,不要使用“int”解析输入坐标,使用文本字符串

如果您使用 php 或类似方法在 html 中打印绳索...浮动到文本并在 html 中打印


Я
Ярослав Рахматуллин

1) 51,983 是字符串类型的数字,不接受逗号

所以你应该把它设置为文本

<input type="text" name="commanumber" id="commanumber" value="1,99" step='0.01' min='0' />

用。。。来代替 。

并将类型属性更改为数字

$(document).ready(function() {
    var s = $('#commanumber').val().replace(/\,/g, '.');   
    $('#commanumber').attr('type','number');   
    $('#commanumber').val(s);   
});

查看http://jsfiddle.net/ydf3kxgu/

希望这可以解决您的问题


实际上,将 type 设置为 text 确实几乎是使 point stay point 的唯一解决方案。与 pattern="\d+\.\d{2}" 一起,我什至认为这样的 UX 是可以接受的......不过,我会放弃 jquery 部分......
佚名

我已经编写了一段自定义代码来执行此操作

如果您想用 . 替换 ,,请完全删除 translate_decimals 函数。

var input = document.querySelector('input[role="custom-number"]'); var bincr = document.querySelector('button[role="increment"]'); var bdecr = document.querySelector('button[role="decrement"]');函数 translate_decimals(side = 0) { input.value = (side == ',' ? input.value.replace('.',',') : input.value.replace(',','.')) ; } translate_decimals(','); bincr.addEventListener('click', ()=>{ if (input.hasAttribute('max')) { if (input.value.substr(0,input.getAttribute('max').length) == input. getAttribute('max').substr(0,input.getAttribute('max').length)) { return; } else { translate_decimals('.'); let temp = input.value; input.value = ""; input.value = (input.hasAttribute('step') ? (parseFloat(temp) + parseFloat(input.getAttribute('step'))) : temp++); translate_decimals(','); } } }); bdecr.addEventListener('click', ()=>{ if (input.hasAttribute('min')) { if (input.value.substr(0,input.getAttribute('min').length) == input. getAttribute('min').substr(0,input.getAttribute('min').length)) { return; } else { translate_decimals('.'); input.value = (input.hasAttribute('step') ? (input.value - input.getAttribute('step')) : input.value--); translate_decimals(','); } } }); /* 增加和减少按钮的样式 */ button[role="increment"], button[role="decrement"] { width:32px; }


l
leymannx

我需要确保仍然可以使用逗号而不是点作为小数分隔符输入值。这似乎是一个古老的问题。背景信息可以在以下链接中找到:

https://www.slightfuture.com/webdev/html5-input-number-localization.html

https://codepen.io/aminimalanimal/full/bdOzRG

我终于用一点 jQuery 解决了它。用点 onChange 替换逗号。到目前为止,这似乎在最新的 Firefox、Chrome 和 Safari 中运行良好。

$('input[type=number]').each(function () {

  $(this).change(function () {

    var $replace = $(this).val().toString().replace(/,/g, '.');

    $(this).val($replace);

  })

});

h
hsc

以下是启用逗号输入并将其替换为 dod 的工作方法。它非常适合用户的连续输入。

这个想法是有一个可以解析成数字“123”的输入。无法解析,但可以解析“123.0”,因此输入的类型可以从“文本”更改回“数字”,它仍然有效。选择“只是”以启用连续输入,因此用户会覆盖附加数字

HTML 元素:

<input type="number" id="numberinput">

Javascript


document.getElementById("numberinput").keydown = function(event)
{
    if (
        event.target.getAttribute('type') === "number" &&
        event.key === "," &&
        event.target.value.indexOf(".") === -1)
    {
        event.preventDefault();
        event.target.setAttribute("type","text");
        event.target.value = event.target.value + ".0";
        event.target.setSelectionRange(event.target.value.length - 1, event.target.value.length);
        event.target.setAttribute("type","number");
    }
}

C
Cleber Spirlandeli

使用模式

<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."
>

祝你好运


嗨,刚刚在 Windows 10 上的 Chrome 62.0.3202.94 中对其进行了测试。它不起作用。使用微调器按钮时,输入恢复为逗号而不是点(考虑到比利时语言环境设置)。不管怎么说,多谢拉。
Z
Zeeshan Eqbal

HTML 步骤属性

<input type="number" name="points" step="3">

示例:如果 step="3",则合法数字可以是 -3、0、3、6 等。

提示: step 属性可以与 max 和 min 属性一起使用,以创建一系列合法值。

注意:step 属性适用于以下输入类型:数字、范围、日期、日期时间、本地日期时间、月、时间和周。


但是......但问题是关于十进制数,step="3" 会将输入限制为仅整数。并且设置 step="0.01" 仍将其显示为昏迷;c

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅