2015-06-14 24 views
1

当使用Google API计算两个位置之间的距离时,它会以字符串格式返回距离。将距离字符串转换为数字

例如:1585 KM,54 KM等

我希望它被转换为数字。将1,525 KM等字符串转换为等数字的最佳方法是什么?利用parseInt.replace()RegExp/[^\d+]/更换不属于输入文本中的数字字符

回答

2

如果您使用的是Google Maps Distance Matrix API,有在distance对象的另一场称为value,它有一个数值。如API中所记录的,单位是米。

但是,为了回答你原来的问题,我会删除从字符串使用正则表达式的所有非数字字符:

var dist = '1,525 KM'; 
dist = Number(dist.replace(/[^\d]/g, '')); 
+1

当它是'1,524.2 KM'(使用','作为小数点和'.'作为小数点)或'1.524,2 KM'(使用'.'小数点和','作为小数点)? – MT0

0

尝试

var text = "1,525 KM"; 
 

 
var n = parseInt(text.replace(/[^\d+]/g, "")); 
 

 
console.log(n);

+1

'变种文字= “1234567890 KM”;''输出1234' – MT0

+0

@ MT0见更新的帖子;将'g'标志添加到'RegExp' – guest271314

2

强烈建议您使用距离value,而不是文字。因为它也可以是.格式,例如1.525 KM

因此为@rink说使用价值,这将是永远meters,你可以按我的意见

valueInKm = value * 0.001 
1

将其转换到你的格式,它是一个更清洁的解决方案,如果你可以使用,.作为小数标记,你可以有小数点,那么你可以使用这样的事情在格式{ value: Number, units: String }返回一个结构:

function getDistance(dist){ 
    var match = /^([+-]?[1-9]\d{0,2}(?:(?:([,.])(?:\d{3}\2)*\d{3}(?:(?!\2)[,.]\d+)?)|[,.]\d+)?|[+-]?0(?:[,.]\d+)?) (.+)$/ 
    .exec(dist); 
    if (match){ 
    return { 
     value: parseFloat(match[1].split(match[2]).join('').replace(',', '.'), 10), 
     units: match[3] 
    }; 
    } 
    return { value: null, units: null }; 
} 

测试:

var results = [ 
    { in: "0 m", dist: 0, units: "m" }, 
    { in: "10 m", dist: 10, units: "m" }, 
    { in: "0.2 m", dist: 0.2, units: "m" }, 
    { in: "0,2 m", dist: 0.2, units: "m" }, 
    { in: "1,202 m", dist: 1202, units: "m" }, 
    { in: "1,524.2 KM", dist: 1524.2, units: "KM" }, 
    { in: "1.524,2 KM", dist: 1524.2, units: "KM" }, 
    { in: "9,234,524.2 KM", dist: 9234524.2, units: "KM" }, 
    { in: "9.234.524,2 KM", dist: 9234524.2, units: "KM" }, 
]; 

var successes = 0; 
for (var i = 0; i < results.length; i++){ 
    var v = getDistance(results[i].in); 
    if (v.value == results[i].dist && v.units == results[i].units) 
    successes++ 
    else 
    console.log(results[i].in, v.value, v.units); 
} 
console.log("Successes:", successes, "Failures:", results.length - successes);