簡體   English   中英

文化不變 Decimal.TryParse()

[英]Culture invariant Decimal.TryParse()

我正在編寫一個自定義字符串到十進制驗證器,它需要使用忽略文化的 Decimal.TryParse(即不關心輸入是否包含“.”或“,”作為小數點分隔符)。 這是建議的方法:

public static bool TryParse(
    string s,
    NumberStyles style,
    IFormatProvider provider,
    out decimal result
)

我不知道用什么作為第三個參數。 我見過的例子是這樣的:

culture = CultureInfo.CreateSpecificCulture("en-GB");
Decimal.TryParse(value, style, culture, out number)

所以他們創造了一種特定的文化。 CultureInfo 沒有“CreateInvariantCulture”方法,並且 CultureInfo.InvariantCulture 不是必需的類型。 正確的用法是什么?

嘗試這樣:

decimal value;
bool b = Decimal.TryParse("0.1", NumberStyles.Any, new CultureInfo("en-US"), out value);

最好的方法可能是使用Decimal.Parse()方法,就像傳統上使用任何十進制字符串值一樣。

您可以使用NumberStyles.Currency來指定將值讀取為貨幣,這將處理任何與貨幣相關的值(您需要添加對System.Globalalization的引用才能使用此值:

using System.Globalization;

Decimal.Parse還接受第三個參數,如果您選擇並希望使用特定的Culture,它將允許您顯式設置IFormatProvider

decimal value = Decimal.Parse(currency, NumberStyles.Currency, CultureInfo.InvariantCulture); //yields 15.55

事實上,這里可以使用CultureInfo.InvariantCulture 該參數需要IFormatProvider ,這是CultureInfo實現的接口。 InvariantCulture是不變的,因為它不隨用戶的設置而變化。

事實上,沒有文化接受,. 作為小數點分隔符——它們都是一個或另一個。 您必須找到一些其他方法來處理可以使用這些小數點分隔符中的任何一個的數據。

我的壞人。 我測試了以下代碼:

        string DutchDecimal = "1,5";
        string EnglishDecimal = "1.5";
        decimal a;
        decimal b;
        Console.WriteLine(decimal.TryParse(DutchDecimal, out a));
        Console.WriteLine(a);
        Console.WriteLine(decimal.TryParse(EnglishDecimal, out b));
        Console.WriteLine(b);
        Console.Read();

並且它正確解析了兩個字符串。 似乎默認的 TryParse 確實是文化不變的。 我認為情況並非如此,因為 EnterpriseLibrary 中的默認 TypeConversionValidator 依賴於文化,我認為它只是使用了 TryParse。 然而,事實證明這個默認解析器是硬編碼的以使用當前文化。

編輯:我發現“1.5”轉換為 1.5,“1,5”轉換為 15。這對於文化不變行為實際上是正確的,所以就是這樣。 這整個問題顯然是由於我對文化不變性如何運作的誤解而產生的。

我不知道用什么作為第三個參數。

因為所有文化NumberDecimalSeparatorNumberGroupSeparator等都不相同。

有人用. 作為NumberDecimalSeparator ,有人使用,但沒有將兩者都用作NumberDecimalSeparator CultureInfo

CultureInfo實現IFormatProvider接口。 這就是為什么如果您指定CultureInfo ,您的value字符串會嘗試根據該文化規則進行解析。

我正在將自定義字符串寫入十進制驗證器,該驗證器需要使用忽略文化的 Decimal.TryParse

在這種情況下,您可以使用CultureInfo.Clone方法來復制您想要的文化(或InvariantCulture ),您可以設置 NumberDecimalSeparator 和 NumberGroupSeparator 您想要的字符串。

我知道這是一個非常古老的問題,但是在搜索具有不變文化的解析時它仍然會彈出。

我在文檔中發現了以下內容

不變的文化是文化不敏感的。 您的應用程序使用空字符串 ("") 或其標識符按名稱指定不變區域性。

因此,使用這些知識,您可以像這樣實例化一個不變的文化:

culture = new CultureInfo(string.Empty);

暫無
暫無

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

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