我正在尝试构建一个能够解析句子并返回数字的 javascript 函数。
这是我为下面的测试用例设置的jsFiddle -
- '我有 1 磅' -> 1
- “我有 3.50 英镑要花”-> 3.50
- “我有 23.00 磅”-> 23
- “27.33 英镑”-> 27.33
- “$4345.85”-> 4345.85
- '3.00' -> 3
- '7.0' -> 7
- “应该有 2.0。” -> 2
- “应该有 15.20。” -> 15.20
- '3.15' -> 3.15
- “我只有5个,不是很好。” -> 5
- “34.23”-> 34.23
- 'sdfg545.14sdfg' -> 545.14
- “昨天我花了 235468.13 英镑。今天我想少花钱。-> 235468.13
- “昨天我花了 340 英镑。” -> 340
- “我今天花了 14.52 英镑,明天花了 17.30 英镑”-> 14.52
- “我有 0 棵树,明天 11.33 英镑”-> 0
16&17 表示它应该找到第一个数字。我知道某些测试用例可能很难,但我欢迎任何能让我得到合理覆盖的东西。
这是我用于我的功能的格式
function parseSentenceForNumber(sentence){
return number; //The number from the string
}
我想我自己可以完成 60-80% 的工作,但我希望正则表达式可能是这里最好的解决方案,而我从来都不擅长它们。希望我有足够的测试用例,但可以随意添加我可能错过的任何测试用例。
非常感谢您的帮助。
**更新**
大量有效的答案,我需要花一些时间更详细地研究它们。Mike Samuel 提到了逗号和 .5,这导致我添加了另外几个测试用例
18.'我有 1,000 英镑' -> 1000 19.'.5' -> 0.5
并且 jsalonen 提到为没有数字添加测试用例
20.'这句话不包含数字' -> null
这是使用 jsalonen 解决方案的更新小提琴,如果没有我对规范的更改,我会 100% 在那里,而我的更改是 95%。任何人都可以用逗号提供数字 18 的解决方案吗?
**更新**
我添加了一条语句来去除 jsalonen 函数中的逗号,我达到了 100%。
这是最终的功能
function parseSentenceForNumber(sentence){
var matches = sentence.replace(/,/g, '').match(/(\+|-)?((\d+(\.\d+)?)|(\.\d+))/);
return matches && matches[0] || null;
}
最后的小提琴
非常感谢您的帮助,并且在此过程中我已经提高了我的正则表达式知识。谢谢