You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyScript中Haversine公式坐标验证问题:无法识别浮点型坐标

问题:PyScript中浮点型坐标输入验证失败,Haversine公式计算异常

我用PyScript写了个经纬度距离计算程序,整数坐标能正常运行,但输入16.34这类浮点型坐标时,输入验证直接触发失败分支。原本用isnumeric()方法做输入验证,以为能支持所有数值类型,结果行不通。

问题根源

Python的str.isnumeric()方法仅当字符串所有字符都是数字字符(包括Unicode数字、全角数字等)且非空时才返回True。而小数点(.)不属于数字字符,所以像"16.34"这类带小数的字符串,即便去掉负号后调用isnumeric(),也会返回False,导致验证失败。

解决方案

推荐两种可靠的验证方式替换原有逻辑:

方法1:用try-except尝试转换为float(简洁高效)

直接尝试将输入字符串转为float,转换成功则说明是合法数值;转换失败时捕获异常,提示输入无效。这种方式能覆盖所有合法浮点格式(正负数、科学计数法等)。

方法2:用正则表达式匹配合法浮点数

如果需要严格控制输入格式,可使用正则匹配符合经纬度规则的数值,示例正则:

^-?(\d+(\.\d+)?|\.\d+)$

该正则匹配:可选负号开头,要么是带/不带小数的整数,要么是纯小数。

修正后的完整代码

注意:需导入math模块(原代码缺失)、修正缩进错误、替换验证逻辑,同时优化变量名提升可读性:

import math
from js import document, alert

def calculate_distance():
    # 获取输入并去除前后空格
    first_lat_str = document.getElementById("FirstLat").value.strip()
    first_long_str = document.getElementById('FirstLong').value.strip()
    sec_lat_str = document.getElementById('SecLat').value.strip()
    sec_long_str = document.getElementById('SecLong').value.strip()

    # 输入验证:尝试转换为float
    try:
        first_lat = float(first_lat_str)
        first_long = float(first_long_str)
        sec_lat = float(sec_lat_str)
        sec_long = float(sec_long_str)
    except ValueError:
        alert("Invalid Input(s), please make sure you have valid coordinates input")
        return False

    # Haversine公式计算球面距离
    # 转换为弧度
    first_lat_rad = math.radians(first_lat)
    sec_lat_rad = math.radians(sec_lat)
    first_long_rad = math.radians(first_long)
    sec_long_rad = math.radians(sec_long)

    dlon = sec_long_rad - first_long_rad
    dlat = sec_lat_rad - first_lat_rad
    a = math.sin(dlat / 2)**2 + math.cos(first_lat_rad) * math.cos(sec_lat_rad) * math.sin(dlon / 2)**2
    c = 2 * math.asin(math.sqrt(a))

    # 地球半径(公里),如需英里可替换为3956
    earth_radius = 6371
    calculated_distance = c * earth_radius

    # 可添加结果展示逻辑,比如输出到页面元素
    print(f"计算得到的距离:{calculated_distance:.2f} 公里")
    return calculated_distance

额外优化说明

  • 原代码中else块缩进错误,导致逻辑无法正常执行,修正后将验证通过的逻辑放在try块成功执行后
  • 调用strip()去除输入前后空格,避免用户输入带空格的无效值
  • 变量名改为Python规范的小写下划线格式,提升代码可读性
  • 移除了冗余的平面距离计算(原代码中先算欧氏距离再用Haversine公式),若需保留可自行加回

内容的提问来源于stack exchange,提问作者Milad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:18:23