用户在编辑框内输入经纬度,点按钮,搜一些东西,我不想麻烦做成限定输入的那种,
想做成类似Google Maps搜索框那样,就一个编辑框,输入
纬度,经度
搜,就行了。
两者
中间可以用中英文逗号、空格隔开但是我这里的经纬度,用户可以以小数、度分秒等方式输入如
113.123, 23.444
113度12分25.6秒, 23度12分11.6秒, 南纬的时候 -23度12分11.6秒 即可
113:12:25.123, 23:15:16.111
113°12′25.123″, 23°12′16.111″这些写法都可以,最终都转换成两个小数,怎么解析呀,救高手
想做成类似Google Maps搜索框那样,就一个编辑框,输入
纬度,经度
搜,就行了。
两者
中间可以用中英文逗号、空格隔开但是我这里的经纬度,用户可以以小数、度分秒等方式输入如
113.123, 23.444
113度12分25.6秒, 23度12分11.6秒, 南纬的时候 -23度12分11.6秒 即可
113:12:25.123, 23:15:16.111
113°12′25.123″, 23°12′16.111″这些写法都可以,最终都转换成两个小数,怎么解析呀,救高手
解决方案 »
- 如何锁定一个函数的作用域?
- jquery datatable
- 请问怎样让checkbox自动选择上
- span那里哪儿错了,就是一个简单的点击一次计算一下,怎么第二行的那个显示不出来,找半天了
- 求助一个JS进度条程序的问题
- radio checked
- web页读excel文件?!乱码!--sos求救
- 怎样实现在客户浏览器中点击一个联接产生在客户机中用记事本打开服务器上的一个文本文件的动作?
- 在vbscript里的function怎么返回值呢?
- 如何用浏览器禁止某一些JS,(不是全部禁止)
- 求高手帮忙修改此段TAB的JS 让切换的同时光标聚焦到文本框内
- 请问有没有可能无论当前用什么浏览器在看网页,弹出的网页都用IE打开?
所以,后三种应该用一种方法就行了,即使用户输入成了113张12李25.6王,也能给他解析出来得了。
var a= s.split(",");for(var i=0;i<a.length;i++ ){
alert(a[i].replace(/^\s|\s$/i,'').match(/(-?[0-9\.]+?)[^0-9\.]+([0-9\.]*?)[^0-9\.]+([0-9\.]+?)/i));
}
<META NAME="Author" CONTENT="theforever(碧海情天),赵亮">
<meta http-equiv="email" content="theforever·163.com">
<meta http-equiv="blog" content="blog.csdn.net/theforever">
<script type="text/javascript">
var s="113°12′25.123, 23°12′16.111";
var a= s.split(",");
for(var i=0;i<a.length;i++ ){
alert(a[i].replace(/[^\d]/g,'|'));
}
</script>
这样的结果更准确。对转换后的结果可以再次split("|"),根据结果的length可以判断是哪种类型,然后进行相应的数据运算处理。
//可以匹配下面的几种情况
/*
X
X.Y
X度
X度Y分
X度Y分Z秒
X度Y分Z.W秒
X:Y
X:Y:Z
X:Y:Z.W
X°
X°Y′
X°Y′Z″
X°Y′Z.W″*/
function check(inputSrc) {
var reg = [
/^([0-9]{1,3})((?:[\.])([0-9]{1,3})?)$/g,
//X.Y X=$1,Y=$3
/^([0-9]{1,3})度((([0-9]{1,2})分((([0-9\.]+)秒)?))?)$/g,
//X度Y分Z.W秒 X=$1,Y=$4,Z.W=$7
/^([0-9]{1,3})(?:\:)((([0-9]{1,2})(?:\:)((([0-9\.]+))?))?)$/g,
//X:Y:Z.W X=$1,Y=$4,Z.W=$7
/^([0-9]{1,3})°((([0-9]{1,2})′((([0-9\.]+)″)?))?)$/g //X°Y′Z.W″X=$1,Y=$4,Z.W=$7
];
var valid = false;//是否有效
for(var i=0,len=reg.length;i<len;i++) {
if(reg[i].test(inputSrc)) {//获得了匹配,格式正确
if(i==0) {
return parseFloat(RegExp.$1 + '.'+ (RegExp.$3==''?0:RegExp.$3));//返回转换后的小数
} else {
var degree = RegExp.$1;//度
var minute = RegExp.$4==''?0:RegExp.$4;//分
var second = RegExp.$7;//秒
if(second!='') {//
if(reg[0].test(second)) {//判断秒是否符合 X.Y的格式,排除不是整数或者小数的情况
second = parseFloat(RegExp.$1 + '.'+ (RegExp.$3==''?0:RegExp.$3));
} else {
continue;//输入的无效,需要进行下一个正则匹配
}
} else {
second = 0;
}
//这里需要进行 度分秒 单位换算
//var XXX = degree + ......
return XXX;
}
}
}
if(valid==false) return false;//说明输入的都不是符合格式的数据}
大概就这样了,正则应该没问题,楼主自己完善试试
var s="113°12′25.123, 23°12′16.111";
var a= s.split(",");
for(var i=0;i<a.length;i++ ){
alert(a[i].replace(/[^\d]/g,'|'));
}
</script>我觉得这个就行啊
reg[0] = /^([0-9]{1,3})(((?:[\.])([0-9]{1,3}))?)$/,
//X.Y X=$1,Y=$4
里面的 RegExp.$3改为 RegExp.$4
把4个正则的选项 g 都去掉,否则容易第一次找到,第二次就找不到了解释一下:(((?:[\.])([0-9]{1,3}))?) 这个正则表示 匹配 ((?:[\.])([0-9]{1,3})) 1次或者多次,整体的也就是匹配 X 或者 X.Y
function parseLngLat(strLngLat) {
var strList = [];
var sum = 0;
//先解析出用逗号或空格分开的经纬度
strList = strLngLat.split(new RegExp(",|,|[ +]"));
var gLngLat;
if (strLngLat.match(/度|°|:/) != null/*.length > 0*/) {
var strDMS = [];
strDMS = strList[0].split(/度|分|:|°|′/g, 3); //match(/\d+/g);
var numDMS = [];
//strDMS可能只有“113度”这种情况,后边没有的补0
for (var i = 0; i < 3; i++) {
if (strDMS[i] == null) {
numDMS[i] = 0;
} else {
numDMS[i] = parseFloat(strDMS[i]);
}
}
var lng = numDMS[0] + numDMS[1] / 60 + numDMS[2] / 3600;
strDMS = strList[1].split(/度|分|:|°|′/g, 3); //.match(/\d+/g);
//strDMS可能只有“113度”这种情况,后边没有的补0
//strDMS可能只有“113度”这种情况,后边没有的补0
for (i = 0; i < 3; i++) {
if (strDMS[i] == null) {
numDMS[i] = 0;
} else {
numDMS[i] = parseFloat(strDMS[i]);
}
}
var lat = numDMS[0] + numDMS[1] / 60 + numDMS[2] / 3600; gLngLat = new google.maps.LatLng(lat, lng);
} else {
gLngLat = new google.maps.LatLng(parseFloat(strList[1]), parseFloat(strList[0]));
}
return gLngLat;}