【发布时间】:2010-07-08 16:15:05
【问题描述】:
这会是一种很好的处理方式吗?
我已经考虑过删除逗号然后解析为浮动。
你知道更好/更清洁的方法吗?
谢谢
【问题讨论】:
-
Here 是一个可靠的解决方案。
标签: javascript parsefloat
这会是一种很好的处理方式吗?
我已经考虑过删除逗号然后解析为浮动。
你知道更好/更清洁的方法吗?
谢谢
【问题讨论】:
标签: javascript parsefloat
parseFloat( theString.replace(/,/g,'') );
【讨论】:
.replace(',', '')
"1,000,000",如果你不使用带全局标志的正则表达式,只会替换第一个逗号 -> "1000,000"。
s.split(needle).join(replacement)。
我不知道为什么没有人建议这个表达-
parseFloat( theString.replace(/[^\d\.]/g,'') );
删除除句点之外的所有非数字字符。您也不需要自定义函数/循环,这只是矫枉过正。
【讨论】:
不。去掉逗号。
【讨论】:
您可以使用字符串替换方法,但不能像正则表达式允许的那样在单行中使用。
while(str.indexOf(',')!=-1)str= str.replace(',','');
parseFloat(str);
或者做一个没有正则表达式的表达式=
return parseFloat(str.split(',').join(''));
我会使用正则表达式。
【讨论】:
我没有足够的声誉来添加评论,但是对于任何想知道正则表达式与拆分/加入的性能的人,这里有一个快速的小提琴:https://jsfiddle.net/uh3mmgru/
var test = "1,123,214.19";
var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
var a = parseFloat(test.replace(/,/g,''));
}
var t1 = performance.now();
document.write('Regex took: ' + (t1 - t0) + ' ms');
document.write('<br>')
var t0 = performance.now();
for (var i = 0; i < 1000000; i++)
{
var b = parseFloat(test.split(',').join(''));
}
var t1 = performance.now();
document.write('Split/join took: ' + (t1 - t0) + ' ms');
我得到的结果是(每个循环 100 万次):
正则表达式:263.335 毫秒
拆分/加入:1035.875 毫秒
所以我认为在这种情况下可以肯定地说正则表达式是要走的路
【讨论】:
基于@kennebec 的想法,如果您想确保逗号正确,并且不想替换逗号,您可以尝试这样的操作:
function myParse(num) {
var n2 = num.split(",")
out = 0
for(var i = 0; i < n2.length; i++) {
out *= 1000;
out += parseFloat(n2[i])
}
return out
}
alert(myParse("1,432,85"));
// Returns 1432085, as the comma is misplaced.
它可能没有那么快,但你想要替代品:)
【讨论】:
解决大多数常见问题的简单函数怎么样?
function getValue(obj) {
Value = parseFloat( $(obj).val().replace(/,/g,'') ).toFixed(2);
return +Value;
}
上述函数从字段中获取值(使用 jQuery)假设输入的值是数字(我宁愿在用户输入数据时验证字段,所以我确定字段内容是数字)。
如果是浮点值,如果字段格式正确,函数将正确返回浮点值。
此功能远未完成,但它可以快速解决输入为 1,234.56 或 1,234,567 的值的“,”(逗号)问题。只要内容是数字,它将返回有效数字。
returnValue前面的+(加号)符号/strong> 命令是 JavaScript 中用于确保返回的变量内容为数字的“肮脏技巧”。
很容易将函数修改为其他用途,例如(例如)将字符串转换为数值,注意“,”(逗号)问题:
function parseValue(str) {
Value = parseFloat( str.replace(/,/g,'') ).toFixed(2);
return +Value;
}
这两种操作甚至可以组合成一个功能。即:
function parseNumber(item,isField=false) {
Value = (isField) ? parseFloat( $(item).val().replace(/,/g,'') ).toFixed(2) : parseFloat( item.replace(/,/g,'') ).toFixed(2)
return +Value;
}
在这种情况下,如果调用函数 result = parseNumber('12,092.98'); 它将解析值,因为它是一个字符串。但如果调用为 result = parseNumber('#MyField', true); 它将尝试从 '#MyField' 获取值。
正如我之前所说,这些功能还远未完成,可以通过多种方式进行扩展。一个想法是检查给定参数(字符串)的第一个字符,并根据字符串格式决定从哪里获取要解析的值(如果第一个字符是 = '#' 那么它是来自 DOM 对象的 ID,否则,如果它以数字开头,则必须是 string 才能被解析)。
试试吧...快乐的编码。
【讨论】: