C#-对象到字符串截断十进制值。0
我试图使用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作为字符串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 编辑: 简单的
希望这次我说得很清楚。如果使用
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"));
强制转换为双精度始终删除尾随零
总而言之,以下是选项:
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
astring
类型。您的是字符串类型吗?在我的答案中进行测试,你会看到它给出了你想要的结果。我知道,使用这种方法,它保留小数,使用JObject.Parse
(Sandeep似乎正在使用的方法)它不保留小数。@CodingYoshi,太棒了!我知道这不是专业的方式,但这是一个小时的需要,所以我不得不这样做。