正则表达式 - 创建正确解释数字的输入/文本区域

Posted

技术标签:

【中文标题】正则表达式 - 创建正确解释数字的输入/文本区域【英文标题】:Regex - creating an input/textarea that correctly interprets numbers 【发布时间】:2014-10-15 08:29:28 【问题描述】:

我正在设计一个转换网站,我在其中对输入的数字进行计算,我需要我的输入或 textarea 来接收和解释以不同方式输入的数字

喜欢:

Entry = 3,000,000.1111            
Interpreted value = 3000000.1111

Entry = 3000000.1111           
Interpreted value = 3000000.1111

我想为欧洲十进制符号添加第二个输入 (或者如果可能有相同的输入两者都做)

Entry = 3.000.000,1111 (comma acts a decimal, decimal as separator)    
Interpreted value = 3000000.1111

我想知道我怎么能做到这一点。我从我的一些研究中怀疑我可以使用正则表达式。 我还应该使用输入还是文本区域?我想将数字的大小限制为 40 个位置。

当使用逗号时,我当前使用的文本区域似乎无法识别逗号后的任何值。我意识到这是由于 parseFloat。所以我需要在解析之前使用 .replace() 删除逗号。但是在逗号是小数点的欧洲符号的情况下我该怎么办?我怀疑我应该使用正则表达式来确定一个数字是逗号十进制表示法还是标准小数点表示法,然后根据它概述适当的替换行为。任何想法如何编写正则表达式以仅通过分隔符和小数点识别 .0000000001 和 1,000,000,000,000,000 之间的数字?当条目不使用时怎么办?以 12000 为例。对此的任何帮助将不胜感激。使用 html5 和 javascript。我没有使用表格,对此我很陌生。这是我的第一个网页,所以请耐心解答我的问题。

我在想这个:

input = //value from textarea as a string
if(/REGEX which determines that the structure of the number is N,NNN.NN/.test(input))
input = input.replace(/\,/,""); //replace the commas with nothing

else if(/REGEX which determine that structure of the number is N.NNN,NN/.test(input)
    input = input.replace(/\./,""); //replace the decimal point separators with nothing
    input = input.replace(/\,/,".");//replace the comma decimal with a point decimal

else
   //input unchanged assuming is NNNN without decimal

number = parseFloat(input);

我想让他们有可能输入大数字并使用小数点后 1 到 10 位以下的数字。感谢那些做出贡献的人。 最佳,RP

【问题讨论】:

【参考方案1】:

我相信这应该可以处理所有事情:

^[1-9](?:\d0,2(?:([,.])\d3)*|\d+)(?:(?!\1)[,.]\d+)?$

您在这里涉足复杂领域。此外,上述 RegEx 不允许小于“1”的值。

基本上,RegEx 执行以下操作:

    不允许使用千分位分隔符(“,”或“.”),但确保它们出现在正确的位置。 允许使用 "," 或 "."用作千分位/分分隔符,但确保分分隔符与千分位分隔符不同。 要求字符串等效数字以“0”以外的任何数字开头。

要实现这一点,您可以将事件侦听器附加到表单元素并使用 JS 执行简单的.test。


进一步阅读后,我想我最初误解了您的目标。我假设您只是想使用 RegEx 验证这些值。我还假设您正在尝试使用货币(即两位小数)。但是,不要担心!如果你真的想要,你仍然可以使用我原来的答案。

您提到了inputtextarea,它们都是表单元素。您可以将侦听器附加到这些元素以查找inputchange 和/或keyup 事件。作为回调的一部分,您可以运行 .test 方法或其他一些功能。就个人而言,我会重新考虑您希望如何处理输入。另外,您在这里的实际目标是什么?您真的需要知道千分位分隔符或跟踪它吗?为什么不直接禁止除一位小数点/逗号和数字以外的任何字符?

此外,将像 .0000000001 这样的数字解析为浮点数是一个糟糕的主意。如果您进行任何类型的计算,例如乘法、除法、幂等,您将很快失去精度。您将不得不想出一种不同的方法来做到这一点,例如将数字单独存储在右侧,而不是作为整数存储然后从那里去。

如果您更详细地描述您正在尝试做的事情,我可以为您提供帮助。

【讨论】:

非常感谢!我将如何应用它? 我没有使用表单。我会采取什么步骤? 所以你的建议是:if(REGEXUGAVE.test(input)//这里发生了什么? 那我没有使用表单怎么办? 你太棒了。我不知道你是怎么写的。我在 .test 中尝试过,所有表格都通过了,但是我需要从标准表示法中删除逗号并删除点分隔符并将逗号小数点更改为解析前的一个点,否则解析无法正确读取数字 我不知道如何回复您的帖子,除非通过这些 cmets。我将更新我的帖子,更详细地描述我正在尝试做的事情。

以上是关于正则表达式 - 创建正确解释数字的输入/文本区域的主要内容,如果未能解决你的问题,请参考以下文章

文本区域输入上的 JavaScript 正则表达式

检测某个单词刚刚输入到文本区域

JavaScript 中怎样判断文本框只能输出英文字母、汉字和数字,不能输入特殊字符!

向 Django 添加文本区域的正确方法是啥?

java 正则怎么匹配符号加中文

在将数据输出回文本区域时,如何正确清理从文本区域接收的数据?