2016-11-23 6 views
0

В проекте MVC, у меня есть набор переменных в Web.config моего проекта, как это:Decimal.Parse странное поведение на Chrome и Firefox

enter image description here

Тогда в моем коде, я понимаю, что переменной и разобрать его в десятичной системе:

enter image description here

enter image description here

Как вы можете видеть, эта работа S хорошо, проблема заключается в том, что когда я запускаю мой код на Google Chrome или Mozilla Firefox, у меня есть Diferent результаты:

enter image description here

enter image description here

Я не undestand, почему это происходит, так как не происходит во всех машины, которые запускают веб-браузер в Chrome, все, что я могу думать, это то, что это похоже на конфигурацию браузера, но его стандартная установка, ничего особенного.

Любой может указать мне в правильном направлении? Или имеет представление о том, что может вызывать такое поведение?

UPDATE:

Код в тексте (я не знаю, почему, но хорошо)

Для удобства отладки-я это:

public static decimal ServiceFee 
    { 
     get 
     { 
      var webConfigVar = ConfigurationManager.AppSettings["ServiceFee"]; 
      decimal webConfigVarDecimal = decimal.Parse(webConfigVar ?? "0"); 
      return webConfigVarDecimal; 
     } 
    } 

Как правило, как это

public static decimal ServiceFee 
    { 
     get 
     { 
      return decimal.Parse(ConfigurationManager.AppSettings["ServiceFee"] ?? "0"); 
     } 
    } 

И Web.Config

<appSettings> 
     <add key="ServiceFee" value="0.024" /> 
    </appSettings> 

UPDATE 2

Я знаю, что код запуск на сервере, но единственное различие заключается в браузере, и его всегда с теми браузерами несколько машин.

Независимо от того, если сервер работает под управлением локального или на производстве

+1

Начать свой код как ** текст ** –

+1

Кроме того, код C# запускается на сервере; не имеет значения, что браузер – BradleyDotNET

ответ

3

Decimal.Parse использует CultureInfo текущего запроса запроса обработки нити, которые ASP.NET может (хотя и не по умолчанию) устанавливается в соответствии с заголовок браузера Accept - так что браузеры, установленные на французском или немецком, будут использовать свои правила форматирования (где запятая ',' - это место радикса, а не точка '.'). Вероятно, это происходит: браузер Chrome настроен на использование другой культуры.

Исправление состоит в том, чтобы указать CultureInfo.InvariantCulture при вызове любого метода Parse или ToString, если он взаимодействует с текстом, удобочитаемым человеком (например, при загрузке файла конфигурации).

Именно поэтому статический анализ важен (меню «Анализ» в Visual Studio) - он может указывать на эти ошибки.

(Мое личное мнение заключается в том, что метод Parse должен быть удален из .NET и заменены явным ParseFormatted(IFormatProvider, String) и ParseInvariant(String) - но это только мне :)

Хочу отметить, что неэффективна всегда вызывать Parse в вашей собственности -getter. Вы просто должны кэшировать статически (с использованием нового C# 6.0 свойство только для чтения синтаксис):

using System.Globalization; 

public static decimal ServiceFee { get; } = 
     Decimal.Parse(
      ConfigurationManager.AppSettings["ServiceFee"] ?? "0", 
      NumberStyles.Number, 
      CultureInfo.InvariantCulture 
     ); 

Если вы делаете это часто вам может понадобиться многоразовый метод:

public static Decimal GetAppSettingDecimal(String name) { 

    String textualValue = ConfigurationManager.AppSettings[ name ]; 
    Decimal ret; 
    return Decimal.TryParse(textualValue, NumberStyles.Number, CultureInfo.InvariantCulture, out ret) ? ret : 0; 
} 

public static Decimal ServiceFee { get; } = GetAppSettingDecimal("ServiceFee"); 
+0

Perfect man !! Просто отлично. Я рассмотрю это предложение. Спасибо чувак. –

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