我正在尝试使用Newtonsoft json库从Json中提取货币值。 SelectToken方法将数据作为对象。我正在将其转换为字符串并插入数据库。 当值为9.9时,我得到精确值作为字符串但是当有9.0时,ToString()会截断十进制值并仅返回9。 我做了很多研究,但没有找到任何答案。
我期待以下值作为来自对象的字符串。我不想要额外的小数位或全部删除。我需要它原样。
对象=>预期的字符串
9 => 9
9.0 => 9.0
9.00 => 9.00
9.9 => 9.9
9.99 => 9.99
编辑:
简单的问题。 如果对象a的值为9.0,那么我希望将相同的值9.0作为字符串。
同样如果它有9则我想要字符串9
如果它有9.90那么我想要9.90作为字符串
如果它有9.99那么我想要9.99作为字符串
我希望这次我很清楚。
答案 0 :(得分:1)
如果您使用JObject.Parse
,为了满足您的需要,您的值必须是字符串。如果它是浮点值,则您不会得到其小数。看看这个例子:
string json = "{ sValue1: '9.00', sValue2: '9.0000', dValue1: 9.00, dValue2: 9.0000 }";
JToken token = JObject.Parse(json);
// prints 9.00, or 9,00 if comma is your decimal separator
Console.WriteLine((decimal)token.SelectToken("sValue1"));
// prints 9.00 regardless of your decimal separator
Console.WriteLine((string)token.SelectToken("sValue1"));
// prints 9.0000, or 9,0000 if comma is your decimal separator
Console.WriteLine((decimal)token.SelectToken("sValue2"));
// prints 9.0000 regardless of your decimal separator
Console.WriteLine((string)token.SelectToken("sValue2"));
// All these print 9
Console.WriteLine((decimal)token.SelectToken("dValue1"));
Console.WriteLine((string)token.SelectToken("dValue1"));
Console.WriteLine((decimal)token.SelectToken("dValue2"));
Console.WriteLine((string)token.SelectToken("dValue2"));
转换为double
始终会删除尾随零。
总结一下,这些是选项:
仅为记录,decimal
数据类型跟踪所使用的精度,因此它知道是否有尾随零。
如果您已经拥有JSON字符串中所有属性的类,则可以使用JsonConvert.DeserializeObject
,如果将它们存储在字符串中,即使它们是浮点数,也会保留尾随零。你可以在CodingYoshi的回答中看到这一点。
PS:正如其他人所提到的,数值应该存储在数据库中,但这是另一个问题。
答案 1 :(得分:1)
在对你的问题的评论中,你说:
如果我使用这个代码价格.SelectToken(“ListPrice”,false).ToString()那么它只给我9个。我理解9.0与9相同,但我的客户想要它,因为它是
在评论中,不同的人建议将其保持为数字,这是一个很好的建议。但是,如果您的客户希望这样,那就是它必须如何。最简单的解决方案是将其反序列化为string
而不是数字类型。例如,想象一下你有这个JSON:
{
Unit: 15.0000,
Value: 14.000
}
如果将其反序列化为以下类型:
public class ItemSize
{
public string Unit { get; set; }
public double Value { get; set; }
}
然后Unit
,因为它是string
,会保留所有小数,但Value
不会。因此,只需将您的属性设置为string
类型,JSON.NET将为您处理它。您可以使用以下代码测试上述内容:
var val = JsonConvert
.DeserializeObject<ItemSize>("{ Unit: 15.0000, Value: 14.000 }");