簡體   English   中英

C#decimal.Parse行為

[英]C# decimal.Parse behaviour

簡短的問題:

為什么這些' ..... '在.NET(C#)中解析小數有效:

decimal res = decimal.Parse("8......15");  // returns 815
decimal res = decimal.Parse("8...15");     // returns 815
decimal res = decimal.Parse("8..15");      // returns 815

這是什么原因?

它失敗了。 你是否有機會參加“。”文化。 千位分隔符和“,”是小數點? Decimal.Parse (和類似的調用)默認使用線程的當前文化。 這是否是一件好事是有爭議的,但與實際行為無關:)

嘗試在decimal.Parse調用中指定CultureInfo.InvariantCulture

decimal res = decimal.Parse("8......15", CultureInfo.InvariantCulture);

我相信這會表現得像你期望的那樣。

我想這是因為解析器實際上並不關心組分隔符 - 它們與將字符串轉換為小數的過程無關。

我們稱他們為千位分隔符,但他們真的不是。 它們是組分隔符 - 你可以每1位數,每10位數,每1位數,所以為什么不是每0位數?

有趣的是,.NET 4的代碼已經改變了 - 這是我對Reflector的相關輸出:

else
{
    if (((currencySymbol == null) || 
         ((chPtr2 = MatchChars(p, currencySymbol)) == null)) && 
        ((ansiCurrencySymbol == null) || 
         ((chPtr2 = MatchChars(p, ansiCurrencySymbol)) == null)))
    {
        break;
    }
    num |= 0x20;
    currencySymbol = null;
    ansiCurrencySymbol = null;
    p = chPtr2 - 1;
}

我不知道為什么,但我知道它是如何工作的(十進制解析器代碼部分見下文)。 如果只是打開點旗並跳過所有點,我想最后一個。

    while (true)
{
    if (((ch >= '0') && (ch <= '9')) || (((options & NumberStyles.AllowHexSpecifier) != NumberStyles.None) && (((ch >= 'a') && (ch <= 'f')) || ((ch >= 'A') && (ch <= 'F')))))
    {
        //Here goes some code...
    }
    else if ((((options & NumberStyles.AllowDecimalPoint) != NumberStyles.None) && ((num & 0x10) == 0)) 
    && (((chPtr2 = MatchChars(p, currencyDecimalSeparator)) != null) || ((flag && ((num & 0x20) == 0)) 
    && ((chPtr2 = MatchChars(p, numberDecimalSeparator)) != null))))
    {
        num |= 0x10;
        p = chPtr2 - 1;
    }
}

使用Reflector工具調查所有代碼。

暫無
暫無

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

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