Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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
C# 如何对存储为字符串的实数执行数学计算?_C#_Decimal_Type Conversion_String Math - Fatal编程技术网

C# 如何对存储为字符串的实数执行数学计算?

C# 如何对存储为字符串的实数执行数学计算?,c#,decimal,type-conversion,string-math,C#,Decimal,Type Conversion,String Math,我有一个类,它包含的值有时是货币值(如1.25、2.50、10.00等),但也可以是字符串“N/a”;因此,它们被声明为字符串: public class PriceVarianceDataExtended { public String ShortName { get; set; } public String ItemCode { get; set; } public String Description { get; set; } public strin

我有一个类,它包含的值有时是货币值(如1.25、2.50、10.00等),但也可以是字符串“N/a”;因此,它们被声明为字符串:

public class PriceVarianceDataExtended
{
    public String ShortName { get; set; }
    public String ItemCode { get; set; }
    public String Description { get; set; }

    public string Week1PriceCraftworks { get; set; }
    public string Week2PriceCraftworks { get; set; }
    public string VarianceCraftworks { get; set; }

    public string Week1PriceChophouse { get; set; }
    public string Week2PriceChophouse { get; set; }
    public string VarianceChophouse { get; set; }

    public string Week1PriceGordonBiersch { get; set; }
    public string Week2PriceGordonBiersch { get; set; }
    public string VarianceGordonBiersch { get; set; }

    public string Week1PriceOldChicago { get; set; }
    public string Week2PriceOldChicago { get; set; }
    public string VarianceOldChicago { get; set; }

    public string Week1PriceOldChiFranchise { get; set; }
    public string Week2PriceOldChiFranchise { get; set; }
    public string VarianceOldChiFranchise { get; set; }

    public string Week1PriceRockBottom { get; set; }
    public string Week2PriceRockBottom { get; set; }
    public string VarianceRockBottom { get; set; }
}
但是,此代码旨在将货币值(作为字符串)存储在合理的位置,并将val设置为“N/a”:

…未能编译,告诉我,“运算符“-”不能应用于'decimal'和'string'类型的操作数”

这就是我的逻辑:

如果输入“If”块,则表示Week1PriceCraftworks和Week2PriceCraftworks包含以字符串表示的数值,如“5.00”和“3.14”

然后使用convert.ToDecimal()调用将“5.00”转换为5,将“3.14”转换为3.14。这将产生1.86的值,然后将其转换为字符串(“1.86”),以便将正确的数据类型分配给pvde.VarianceCraftworks

但是,在我看来,这是合理和直截了当的,我得到了错误的信息。我的方法有什么问题

顺便说一句,“week1”和“week2”值是通过调用以这种方式结束的方法来设置的:

return price ?? NOT_APPLICABLE;

…因此,Week1PriceCraftworks和Week2PriceCraftworks中包含的是实值(存储为字符串)或“N/A”。

问题是基于括号的优先顺序。由于ToDecimal().ToString()的原因,它的计算结果为十进制字符串

如果您将其更改为下面的值,它应该可以工作

(
  Convert.ToDecimal(pvde.Week2PriceCraftworks) - 
  Convert.ToDecimal(pvde.Week1PriceCraftworks)
).ToString();

问题是基于括号的优先顺序。由于ToDecimal().ToString()的原因,它的计算结果为十进制字符串

如果您将其更改为下面的值,它应该可以工作

(
  Convert.ToDecimal(pvde.Week2PriceCraftworks) - 
  Convert.ToDecimal(pvde.Week1PriceCraftworks)
).ToString();

所以答案就在你的心里

pvde.VarianceCraftworks = 
        Convert.ToDecimal(pvde.Week2PriceCraftworks) - 
        Convert.ToDecimal(pvde.Week1PriceCraftworks).ToString(); // to string is called during the operation rather than afterwards
其次,我将把您的一些代码移到扩展方法中:

pvde.Week1PriceCraftworks != NOT_APPLICABLE

然后它会读得更好:

private string NOT_APPLICABLE = "N/A";
. . .
pvde.VarianceCraftworks = NOT_APPLICABLE;
if (pvde.Week1PriceCraftworks.HasValue() && 
    pvde.Week2PriceCraftworks.HasValue())
{
    pvde.VarianceCraftworks = 
        (pvde.Week2PriceCraftworks.ToDecimal() - 
        pvde.Week1PriceCraftworks.ToDecimal()).ToString();
}
如果您选择转到
Nullable
等,则还可以更改
HasValue
的实现

您甚至可以更进一步,减去两个已知的十进制字符串:

public static string SubtractDecimals(this string value, string subtractValue)
{
    return (value.ToDecimal() - value.ToDecimal()).ToString();
}
所以现在:

private string NOT_APPLICABLE = "N/A";
. . .
pvde.VarianceCraftworks = NOT_APPLICABLE;
if (pvde.Week1PriceCraftworks.HasValue() && 
    pvde.Week2PriceCraftworks.HasValue())
{
    pvde.VarianceCraftworks = pvde.Week2PriceCraftworks.SubtractDecimal(pvde.Week1PriceCraftworks);
}

使用这些扩展方法的好处在于,您现在可以用简单的英语阅读正在发生的事情,而不必阅读大量的实现细节。您还可以测试这些单独的扩展方法,以确定哪些部分不起作用,如果由于某种原因解决方案不起作用,您的预期效果如何。

因此答案就在您的范围之内

pvde.VarianceCraftworks = 
        Convert.ToDecimal(pvde.Week2PriceCraftworks) - 
        Convert.ToDecimal(pvde.Week1PriceCraftworks).ToString(); // to string is called during the operation rather than afterwards
其次,我将把您的一些代码移到扩展方法中:

pvde.Week1PriceCraftworks != NOT_APPLICABLE

然后它会读得更好:

private string NOT_APPLICABLE = "N/A";
. . .
pvde.VarianceCraftworks = NOT_APPLICABLE;
if (pvde.Week1PriceCraftworks.HasValue() && 
    pvde.Week2PriceCraftworks.HasValue())
{
    pvde.VarianceCraftworks = 
        (pvde.Week2PriceCraftworks.ToDecimal() - 
        pvde.Week1PriceCraftworks.ToDecimal()).ToString();
}
如果您选择转到
Nullable
等,则还可以更改
HasValue
的实现

您甚至可以更进一步,减去两个已知的十进制字符串:

public static string SubtractDecimals(this string value, string subtractValue)
{
    return (value.ToDecimal() - value.ToDecimal()).ToString();
}
所以现在:

private string NOT_APPLICABLE = "N/A";
. . .
pvde.VarianceCraftworks = NOT_APPLICABLE;
if (pvde.Week1PriceCraftworks.HasValue() && 
    pvde.Week2PriceCraftworks.HasValue())
{
    pvde.VarianceCraftworks = pvde.Week2PriceCraftworks.SubtractDecimal(pvde.Week1PriceCraftworks);
}


使用这些扩展方法的好处在于,您现在可以用简单的英语阅读正在发生的事情,而不必阅读大量的实现细节。您还可以测试这些单独的扩展方法,以查看由于某种原因解决方案不起作用时,哪些部分不起作用以及您期望的效果。

尝试
()
(Convert.ToDecimal(pvde.Week2PriceCraftworks)-Convert.ToDecimal(pvde.Week1PriceCraftworks))
.ToString();你为什么不直接使用nullable呢?@AlexD:这很有效;如果你愿意,请回答。@B.ClayShannon哦,谢谢!其他人已经添加了它:-)!尝试
()
(Convert.ToDecimal(pvde.Week2PriceCraftworks)-Convert.ToDecimal(pvde.Week1PriceCraftworks))
.ToString();你为什么不直接使用nullable呢?@AlexD:这很有效;如果你愿意,请回答。@B.ClayShannon哦,谢谢!其他人已经添加了它:-)!什么不可以?我从头顶上写下了这个什么没有?我在头上写下了这句话。请解释一下为什么这段代码有助于OP。这将有助于提供一个未来观众可以从中学习的答案。有关更多信息,请参阅。但是我的答案实际上等于已接受的答案,因此它是不必要的,并且可以删除。当我写它时,另一个答案没有发布。你问你的答案出了什么问题,并且有人告诉你答案出了什么问题。如何处理这些信息取决于您。请添加一些解释,说明此代码为何有助于OP。这将有助于提供一个未来观众可以从中学习的答案。有关更多信息,请参阅。但是我的答案实际上等于已接受的答案,因此它是不必要的,并且可以删除。当我写它时,另一个答案没有发布。你问你的答案出了什么问题,并且有人告诉你答案出了什么问题。你如何处理这些信息取决于你自己。