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

编写JSON解析器:如何区分字符串中的整数与浮点数?

JSON字符串中整数与浮点数的区分方案

核心判定依据(基于JSON官方规范)

JSON规范(RFC 8259)明确了数字的两种语法特征,这是区分的核心标准:

  • 整数:可选正负号,后跟纯数字序列,满足:
    1. 要么是单个0
    2. 要么是以非0数字开头的数字串(不能是0123这类前置零的形式)
    3. 无小数点、指数标识(e/E)
  • 浮点数:只要满足任一以下特征,就判定为浮点数:
    1. 包含小数点(如123.、.456、123.456)
    2. 包含e或E开头的指数部分(如1e5、-2E-3)
    3. 纯数字串但超出目标整数类型的存储范围(比如32位int无法存2147483648,需按浮点数处理)

分支处理逻辑

  1. 先做特征扫描:遍历字符串,跳过开头的正负号后,检查是否存在.、e、E:
    • 若存在,直接用strtod解析为浮点数
    • 若不存在,进入整数判定流程
  2. 整数有效性验证:
    • 用strtol解析,同时检查解析后的剩余指针是否指向字符串末尾(确保整个串都是有效整数内容,排除123abc这类无效情况)
    • 对比解析结果与目标整数类型的上下限(比如INT_MAX/INT_MIN),若在范围内则保留整数类型;若超出,改用strtod解析为浮点数
  3. 特殊情况处理:
    • "0"是整数,"0.0"是浮点数
    • "-0"按JSON规范允许,但因整数无负零概念,建议按浮点数处理

嵌入式场景轻量优化

因为无法使用charconv,可以手动实现极简的字符扫描:

  • 手动遍历字符串,跳过开头的+/-
  • 逐个检查后续字符,一旦遇到非数字的./e/E,直接标记为浮点数
  • 纯数字场景下,手动做范围判断(比如逐位计算数值,提前判断是否超出整数类型范围,避免strtol溢出的未定义行为)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:27:20