2016-09-15 2 views
1

В .NET, может кто-нибудь сказать мне, почему это работает:.NET Decimal.Parse бросает FormatException при использовании периода в качестве разделителя

Decimal.Parse("1,234.56", CultureInfo.GetCultureInfo("en-US")); 

Но это бросает System.FormatException?

Decimal.Parse("1.234,56", CultureInfo.GetCultureInfo("fr-FR")); 

Есть рекомендуемый подход к синтаксическому анализу европейских чисел, которые могут содержать период в качестве разделителя и запятой в качестве десятичной точки?

Спасибо!

+3

В каждой стране есть собственные настройки, европейский стандарт отсутствует. – BWA

ответ

7

Французский CultureInfo «s NumberFormatInfo использует пространство как NumberGroupSeparator - так это работает, например:

Decimal.Parse("1 234,56", CultureInfo.GetCultureInfo("fr-FR")); 

Если вы хотите использовать . в качестве разделителя тысяч, вы будете нуждаться в культуре, где это NumberGroupSeparator. Например, вы могли бы использовать испанский:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main()   
    { 
     var culture = (CultureInfo) CultureInfo.GetCultureInfo("es-ES"); 
     var d = Decimal.Parse("1.234,56", culture); 
     Console.WriteLine(d); 
    } 
} 

Или изменить другую культуру:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main()   
    { 
     // Call clone to make sure it's mutable 
     var culture = (CultureInfo) CultureInfo.GetCultureInfo("fr-FR").Clone(); 
     culture.NumberFormat.NumberGroupSeparator = "."; 
     var d = Decimal.Parse("1.234,56", culture); 
     Console.WriteLine(d); 
    } 
} 
+0

На странице MSDN кажется, что в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – dtlvd

+0

@dtlvd: Отлично, что, кажется, работает - будет редактировать. –

+0

Ах! Моя ошибка, спасибо! – user3767420

1

От MSDN, правильный формат для ("FR-FR") должно быть:

Decimal.Parse("1 234,56", CultureInfo.GetCultureInfo("fr-FR")); 

, который будет производить тот же выход, что и выше, как для («en-US»)

1234,56

Проверить этот пример here.

Смежные вопросы