Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Decimal没有转换指数值(jsonConverter从JSON到C#)-映射_C#_Json_Asp.net Mvc_Json.net - Fatal编程技术网

Decimal没有转换指数值(jsonConverter从JSON到C#)-映射

Decimal没有转换指数值(jsonConverter从JSON到C#)-映射,c#,json,asp.net-mvc,json.net,C#,Json,Asp.net Mvc,Json.net,通过使用JSON转换器将JSON转换为c#,我面临一个问题。其中我有一个字段decimal,JSON有一个指数值,它不转换,因为decimal将其作为字符串而不是双精度: 错误:无法将字符串转换为十进制:1.096E8 C# public decimal Amount { get; set; } JSON "Amount":"1.096E8" 如果您想通过JsonConverter转换指数,那么 public class MyClassName { [JsonConverter

通过使用JSON转换器将JSON转换为c#,我面临一个问题。其中我有一个字段decimal,JSON有一个指数值,它不转换,因为decimal将其作为字符串而不是双精度:

错误:无法将字符串转换为十进制:1.096E8

C#    
public decimal Amount { get; set; }
JSON
"Amount":"1.096E8"

如果您想通过
JsonConverter
转换指数,那么

public class MyClassName
{
    [JsonConverter(typeof(JsonExponentialConverter))]
    public decimal Amount { get; set; }
}
这是一个json转换器,用于将指数数转换为十进制数

public class JsonExponentialConverter : JsonConverter
{
    public override bool CanRead { get { return true; } }
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        decimal amount = 0;
        if (decimal.TryParse(reader.Value.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out amount))
        {
            return amount;
        }
        return amount;
    }
}
并使用类似json的反序列化程序调用上述类

public class Program
{
    static void Main(string[] args)
    {
        var json = @"{'Amount':'1.096E8'}";
        var amount = JsonConvert.DeserializeObject<MyClassName>(json);
    }
}
公共类程序
{
静态void Main(字符串[]参数)
{
var json=@“{'Amount':'1.096E8'}”;
var amount=JsonConvert.DeserializeObject(json);
}
}
输出:


所以我使用了[JsonConstructor],我将它附加到了类的自定义构造函数中

这是代码

 class myClass
 {
    public decimal Amount { get; set; }

    [JsonConstructor]
    public myClass(string amount)
    {
        this.Amount = Decimal.Parse(amount, System.Globalization.NumberStyles.Float);
    }
}

你是如何试图转化的?你试过什么?试试这个
double.Parse(“1.096E-8”,CultureInfo.InvariantCulture)
这个值不能转换成
decimal
-但是如果你让属性
double
使用
double
数据类型,比如
public double Amount{get;set;},它会起作用
然后将其指定为
var exp=double.Parse(amount,NumberStyles.AllowExponent | NumberStyles.Float,CultureInfo.InvariantCulture)。要再次显示指数表示法,请使用
string.Format(“{0:e}”,exp)@StephenMuecke double是自动舍入值,因此我无法使用double@WarisSarwar,查看答案可能对你有帮助:)查看,看起来不错,但我已经做了,顺便说一句,非常感谢:)看看我的答案,在这里你必须在构造函数中传递
amount
,每次你必须将它转换为十进制。在我的答案中,你不需要任何构造函数来定义它和它的可重用代码,你可以在任何地方使用它,只要定义你的任何十进制属性类似于
[JsonConverter(typeof(JsonExponentialConverter))]
而不需要在每个构造函数中编写代码。始终尝试使用可重用代码。同意,但要使用此属性[JsonConverter(typeof(JsonExponentialConverter))]我必须创建类JsonExponentialConverteryes这很好创建一次,您的模型变得干净,而不是您必须在您的模型中编写代码,并在构造函数中每次传递数量,当您在项目中的任何地方调用此模型时,请告诉我哪一个是好的?我认为创建类没什么大不了的,它的可重用性也很重要,如果你的数量不是指数级的,那么你的代码将如何处理这意味着如果它包含像
1.096E8XX
,它会抛出一个异常,你必须处理它,假设您的json不包含此类错误,但最后您还需要处理这些场景。