簡體   English   中英

C#-字符串對象截斷十進制值.0

[英]C# - object to string truncates decimal value .0

我正在嘗試使用Newtonsoft json庫從Json提取貨幣值。 SelectToken方法將數據作為對象。 我將其轉換為字符串並插入DB中。 當值說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作為字符串

希望這次我清楚。

如果使用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. 字符串=>字符串:確切結果
  2. 字符串=>十進制:如果十進制分隔符匹配,則精確結果
  3. 字符串=>浮點數/雙精度:不帶尾隨零
  4. 浮點=>任意:不帶零

僅出於記錄目的, decimal數據類型會跟蹤使用的精度,因此它知道是否存在尾隨零。

如果您已經擁有JSON字符串中所有屬性的類,則可以使用JsonConvert.DeserializeObject ,即使將它們存儲在字符串中,即使它們是浮點型,也可以保留尾隨零。 您可以在CodingYoshi的答案中看到這一點。

PS:正如其他人提到的那樣,數值應該這樣存儲在數據庫中,但這是另一個問題。

在對您的問題的評論中,您說:

如果我使用此代碼price.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 }");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM