题目来源: Codewars
题目: Coordinates Validator
题目难度: 4kyu(理论上难,实际本题不是很难)
You need to create a function that will validate if given parameters are valid geographical coordinates.
Valid coordinates look like the following: "23.32353342, -32.543534534". The return value should be either true or false.
Latitude (which is first float) can be between 0 and 90, positive or negative. Longitude (which is second float) can be between 0 and 180, positive or negative.
Coordinates can only contain digits, or one of the following symbols (including space after comma) -, .
There should be no space between the minus "-" sign and the digit after it.
Here are some valid coordinates:
. -23, 25
. 24.53525235, 23.45235
. 04, -23.234235
. 43.91343345, 143
. 4, -3
And some invalid ones:
. 23.234, - 23.4234
. 2342.43536, 34.324236
. N23.43345, E32.6457
. 99.234, 12.324
. 6.325624, 43.34345.345
. 0, 1,2
. 0.342q0832, 1.2324
个人理解(其实不用翻译)
寻找坐标集合,第一个为纬度,范围[-90,90];第二个为经度,范围[-180,180],如果是负的,负号与后面的数字没有空格,不允许出现字母.
解法:要么从正面验证,要么从反面排除
function isValidCoordinates(coordinates) {
//以','分割后的长度不为2的排除
if (coordinates.split(',').length != 2) {
return false
}
//取出'纬度'和'精度'
latitude = coordinates.split(',')[0]
longitude = coordinates.split(',')[1]
//'纬度'或'精度'中包含字母的排除
if (latitude.search(/[a-zA-z]|' '/) >= 0 || longitude.search(/[a-zA-z]|' '/) >= 0) {
return false
}
//取绝对值方便使用
latitude = Math.abs(latitude)
longitude = Math.abs(longitude)
//超出范围的排除.在使用Math.abs后部分会出现NaN:
//中间包含'-',' '的情形,也需要排除
if (isNaN(latitude) || latitude > 90 || isNaN(longitude) || longitude > 180) {
return false
}
return true;
}
再说几句: 做完也没认真去想,在查看了Codewars上网友的答案后,发现上述的排除过程除了最后一步,都是可以通过正则实现(最后一步也不会出现判断NaN的情况),实际最后只需要判断范围(未联系相关答案作者,所以没有贴出代码)
正则表达式是个好东西!!!