簡體   English   中英

如何對存儲為字符串的實數執行數學計算?

[英]How can I perform a mathematical calculation on real numbers stored as strings?

我有一個包含有時是貨幣值的值的類(例如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”:

private string NOT_APPLICABLE = "N/A";
. . .
if (pvde.Week1PriceCraftworks != NOT_APPLICABLE && 
    pvde.Week2PriceCraftworks != NOT_APPLICABLE)
{
    pvde.VarianceCraftworks = 
        Convert.ToDecimal(pvde.Week2PriceCraftworks) - 
        Convert.ToDecimal(pvde.Week1PriceCraftworks).ToString();
}
else
{
    pvde.VarianceCraftworks = NOT_APPLICABLE;
}

...編譯失敗,告訴我,“ 運算符'-'無法應用於類型為'decimal'和'string'的操作數

所以這是我的邏輯:

如果輸入了“ if”塊,則意味着Week1PriceCraftworks和Week2PriceCraftworks包含以字符串表示的數值,例如“ 5.00”和“ 3.14”

然后,我使用Convert.ToDecimal()調用將“ 5.00”轉換為5,將“ 3.14”轉換為3.14。 那應該產生一個1.86的值,然后將其轉換為字符串(“ 1.86”),以便將正確的數據類型分配給pvde.VarianceCraftworks。

但是,在我看來,這是合理而直接的,我得到了err msg。 我的方法有什么問題?

順便說一句,通過調用以這種方式結束的方法來設置“ week1”和“ week2”值:

return price ?? NOT_APPLICABLE;

...因此Week1PriceCraftworks和Week2PriceCraftworks中包含的是實際值(存儲為字符串)或“ N / A”。

所以答案就在你的內心

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

public static bool HasValue(this string value)
{
    return value != NOT_APPLICABLE;
}

Convert.ToDecimal(pvde.Week2PriceCraftworks)

public static decimal ToDecimal(this string value)
{
    return Convert.ToDecimal(value);
}

然后,它將變得更好:

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<T>等,這也使您能夠更改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();

問題是基於括號的優先順序。 由於ToDecimal()。ToString(),它的計算結果為Decimal-String。

如果您將其更改為以下內容,則應該可以使用

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

暫無
暫無

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

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