2016-01-27 37 views
7

當使用區域性信息時,將數字轉換爲雙精度值時出現奇怪的行爲。
使用荷蘭文化轉換"3,3"時,處理正確。如果我使用美國文化轉換"3,3",則返回33。我期待着一個錯誤。看我的例子:將小數點分隔符錯誤地轉換爲雙數

static void Main(string[] args) 
{ 
    CultureInfo cultureDutch = new CultureInfo("nl-NL"); 
    CultureInfo cultureUS = new CultureInfo("en-US"); 

    System.Threading.Thread.CurrentThread.CurrentCulture = cultureDutch; 
    Console.WriteLine("Input 3,3 --> Expected 3,3"); 
    Console.WriteLine("Output = " + Convert.ToDouble("3,3", cultureDutch)); 
    // Actual result --> 3,3 

    Console.WriteLine("Input 3,3 --> Expected InvalidCastException"); 
    Console.WriteLine("Output = " + Convert.ToDouble("3,3", cultureUS)); 
    // Actual result --> 33 

    Console.WriteLine(); 
    Console.WriteLine(); 

    System.Threading.Thread.CurrentThread.CurrentCulture = cultureUS; 
    Console.WriteLine("Input 3.3 --> Expected InvalidCastException"); 
    Console.WriteLine("Output = " + Convert.ToDouble("3.3", cultureDutch)); 
    // Actual result --> 33 

    Console.WriteLine("Input 3.3 --> Expected 3.3"); 
    Console.WriteLine("Output = " + Convert.ToDouble("3.3", cultureUS)); 
    // Actual result --> 3.3 
    Console.ReadLine(); 
} 

什麼是正確的方法來處理?當小數點(或千位)分隔符無效時,我更喜歡一個例外。

+0

逗號是千位分隔符,.NET對用戶放置位置沒有挑剔。或者像印度人那樣,用戶有不規則的模式。你需要追求真正的解決方案,並知道用戶說什麼語言。這從來不是一個真正的問題,它是Thread.CurrentCulture。當你說荷蘭語時,你只會遇到這個問題,假裝不是來自荷蘭,而是不告訴操作系統。 –

回答

0

加上Boas Enkler的回答,我已經能夠解決這個問題。所以首先我會根據當前的文化來掃描千位分隔符的輸入。最後,我將解析輸入值爲double。

private static string RemoveThousandSeparator(string input) 
    { 
     Regex removeThousandSeparatorExpr = new Regex(@"^-?(?:\d+|\d{1,3}(?:\" 
         + <CultureInfo>.NumberGroupSeparator + @"\d{3})+)(?:\" 
         + <CultureInfo>.NumberDecimalSeparator + @"\d+)?$"); 
     Match match = removeThousandSeparatorExpr.Match(input); 
     if (match.Success) 
     { 
      input = input.Replace(<CultureInfo>.NumberGroupSeparator, ""); 
     } 
     else 
     { 
      throw new Exception("Invalid input value"); 
     } 

     return input; 
    } 
2

如果你只是想分析它,我會使用專用的解析方法,可以在其中設置的NumberStyles

下面的代碼會拋出一個出現FormatException

var culture =new CultureInfo("en-US"); 
var result = double.Parse("3,3", NumberStyles.AllowDecimalPoint, culture); 

欲瞭解更多信息,請參閱Double.Parse Method

+0

我認爲這是答案,但不幸的是它不是。由於輸入可以包含小數和千位分隔符,所以不允許使用千位分隔符。在美國文化1,000.0是正確的,但使用AllowDecimalPoint,它被認爲是無效的。我想我需要一個正則表達式去除千位分隔符,然後在計算中使用這些值。 –

相關問題