【发布时间】:2021-09-25 16:23:27
【问题描述】:
我尝试更好地理解 JSON 字符串。尤其是那种格式的数字。
检查 JSON 字符串是否为 valid number 很容易(如后所述),但是将数字解析为 JSON 字符串的约定是什么?
数字5 可以轻松解析为"5",但我应该将5000 解析为"5000"、"5e3" 还是"5E3"?
对于太小/太大以至于我们使用e的数字,是否有一个被广泛接受的(约定?)最小/最大界限?
关于这个主题的第二个问题:我将如何检查 JSON 字符串是否存储整数值。出现这个问题是因为"5e-2" 是0.05。该字符串不包含".",但仍然是一个分数,这很重要。当然,我可以通过简单地使用 Number() (JavaScript) 解析值并使用 Number.isInteger() (JavaScript) 检查它是否是整数来做到这一点。但这并不能帮助我更好地理解它。我可以检查字符串是否包含"e-"/"E-",然后检查以下数字是否大于"."/"e"/"E"之前的位数?
为了检查 JSON 字符串是否为有效数字(不是整数),我在 JavaScript 中使用了这个正则表达式:
// JavaScript
const isJsonNumberRegex = /^-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+-]?\d+)?$/m;
function isJsonNumber(n: string): boolean {
return n.match(isJsonNumberRegex) !== null;
}
字符串可以以"-" 开头,然后是单个0 或 一个数字1-9,然后可以选择后跟任意数量的数字0-9。如果它是一个分数,它后面跟着一个".",然后是任意数量的数字0-9。要使用指数,它以字符"e" 或"E" 开头,后跟"+" 或"-",然后是任意数量的数字0-9。
例如:
function isJsonNumber(n){
return n.match(/^-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+-]?\d+)?$/m) !== null;
}
console.log(isJsonNumber("-12.34E+56")); // true
console.log(isJsonNumber("0.0e-010")); // true
console.log(isJsonNumber("+0")); // false
console.log(isJsonNumber(".5")); // false
console.log(isJsonNumber("a")); // false
【问题讨论】:
标签: javascript json floating-point numbers conventions