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

C#-对象到字符串截断十进制值。0,c#,json,C#,Json,我试图使用Newtonsoft Json库从Json中提取货币值。SelectToken方法将数据作为对象提供给我。我将其转换为字符串并插入DB。 当值为9.9时,我得到的确切值为string,但当值为9.0时,ToString()将截断十进制值并仅返回9。 我做了很多研究,但没有找到任何答案 我期望以下值作为对象的字符串。我不想增加小数点或删除所有小数点。我现在就需要它 对象=>所需字符串 9=>9 9.0=>9.0 9.00=>9.00 9.9=>9.9 9.99=>9.99 编辑: 简单的

我试图使用Newtonsoft Json库从Json中提取货币值。SelectToken方法将数据作为对象提供给我。我将其转换为字符串并插入DB。 当值为9.9时,我得到的确切值为string,但当值为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作为字符串


希望这次我说得很清楚。

如果使用
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"));
强制转换为双精度始终删除尾随零

总而言之,以下是选项:

  • String=>String:确切的结果
  • String=>decimal:如果十进制分隔符匹配,则为精确结果
  • 字符串=>float/double:不带尾随零
  • Float=>任意值:不带尾随零
  • 仅为了记录,
    decimal
    数据类型跟踪使用的精度,因此它知道是否有尾随的零

    如果您已经为JSON字符串中的所有属性创建了一个类,那么可以使用
    JsonConvert.DeserializeObject
    ,如果您将尾随零存储在字符串中,即使它们是浮点数,也会保留尾随零。你可以在Codingyosi的回答中看到这一点


    PS:正如其他人提到的,数字值应该存储在数据库中,但这是另一个问题。

    在对您的问题的评论中,您说:

    如果我使用这个代码price.SelectToken(“ListPrice”,false).ToString(),那么它只给我9。我知道9.0和9是一样的,但我的客户希望它保持原样

    在评论中,许多人建议将其保留为数字,这是一个很好的建议。然而,如果你的客户想这样做,那就必须这样做。最简单的解决方案是将其反序列化为
    字符串
    ,而不是数字类型。例如,假设您有以下JSON:

    {
        Unit: 15.0000,
        Value: 14.000
    }
    
    如果将其反序列化为以下类型:

    public class ItemSize
    {
        public string Unit { get; set; }
        public double Value { get; set; }
    }
    
    然后
    单元
    ,因为它是一个
    字符串
    ,将保留所有小数,但
    将不保留。因此,只要将您的属性设置为
    字符串
    类型,JSON.NET就会为您处理它。您可以使用以下代码测试上述内容:

    var val = JsonConvert
        .DeserializeObject<ItemSize>("{ Unit: 15.0000, Value: 14.000 }");
    
    var val=JsonConvert
    .DeserializeObject(“{Unit:15.0000,Value:14.000}”);
    
    为什么需要字符串?数据库中的列类型是VARCHAR类型还是任何其他字符串类型?在DB中,它是VARCHAR,您不应该这样做。对数值使用十进制、数字或任何其他数字类型。请注意,行为也会因您使用的是
    十进制
    还是
    双精度
    而有所不同(前者更适用于货币值)。坦率地说,你的问题还不清楚,但这里有一些可能重复的问题,这取决于你实际上问的是什么:,和。无论如何,你的问题似乎没有什么新奇之处;您应该花一些时间搜索堆栈溢出,以查找解决您问题的现有问题,因为它们确实存在。难道“免费”产品的价格不应该为零吗?你在这里冒着维修大麻烦的风险。如果你现在就把事情做好就好了。你确定吗?在我的测试中,一旦解析JSON字符串,所有这些尾随的零都将丢失。这是有道理的,因为JavaScript中
    9.0
    9.0000
    的存储完全相同。@Andrew看我的类,我将属性
    Unit
    a
    string
    类型。您的是
    字符串类型吗?在我的答案中进行测试,你会看到它给出了你想要的结果。我知道,使用这种方法,它保留小数,使用
    JObject.Parse
    (Sandeep似乎正在使用的方法)它不保留小数。@CodingYoshi,太棒了!我知道这不是专业的方式,但这是一个小时的需要,所以我不得不这样做。