我有类似JSON的输入格式:
{
"a": 2,
"b": 0.0,
"c": "hi"
}
有浮点值(始终带小数点)和整数值(无小数点)。我需要使用Javascript解析它,使用它然后将其写回文件(带小数点的浮点数)。
直接将它解析为经典对象,但我需要在编码时区分Floats和Integers。我目前使用这个丑陋的JS结构:
{
type: "Object",
value: {
a: {type: "Integer", value: 2},
b: {type: "Float" , value: 0},
c: {type: "String" , value: "hi"}
}
}
我想简化我的结构。有没有办法区分JS数字中的Floats和Integers?喜欢"免费比特"或者其他的东西?或者也许是一些聪明的把戏
E.g。如果我的所有输入数字都是正数,我可以将整数存储为正数,将浮点数存储为负数。但他们不是:(任何其他想法?
答案 0 :(得分:1)
在JavaScript中,所有数字都以64位浮点形式在内部表示。 JavaScript中只有float
或integer
没有这样的东西,只有Number
。因此,如果您想将信息传递给另一个系统,关于这是否是float
或integer
,您必须在其他地方对其进行编码,类似于您已有的结构。
在JavaScript中无法检测数字文字是否用小数部分表示。你可以得到的最接近的是测试一个数字是否有一个小数部分。使用模运算符(%
)很容易做到:
2 % 1 === 0
> true
2.0 % 1 === 0
> false
但是,这仍然无法区分0.0
等数字表单与0
:
0 % 1 === 0
> true
0.0 % 1 === 0
> true
如果您的数字实际上存储为字符串,则只需测试.
字符:
"0".indexOf(".") === -1
> true
"0.0".indexOf(".") === -1
> false
答案 1 :(得分:0)
您可以使用parseInt
或模运算符,并执行一些花哨的技巧,例如
if (parseInt(n) === n)
console.log("Integer");
else
console.log("Float");
或
if (n % 1 === 0)
console.log("Integer");
else
console.log("Float");
答案 2 :(得分:0)
我最终决定将数字保存为字符串并使用第一个字符来区分它们(i:integer,f:float,s:string)。访问值时我将不得不进行额外的解析。
{
"a": "i2",
"b": "f0",
"c": "shi"
}