C# - 对象到字符串截断十进制值.0

时间:2017-06-18 00:33:09

标签: c# json

我正在尝试使用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作为字符串

我希望这次我很清楚。

2 个答案:

答案 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始终会删除尾随零。

总结一下,这些是选项:

  1. String =>字符串:确切结果
  2. String =>十进制:小数分隔符匹配的确切结果
  3. String => float / double:没有尾随零
  4. Float =>无论如何:没有尾随零
  5. 仅为记录,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 }");