2016-11-23 4 views
0

In einem MVC-Projekt, ich habe einen variable Satz in der web.config von meinem Projekt wie diese:Decimal.Parse seltsames Verhalten auf Chrome und Firefox

enter image description here

Dann in meinem Code, erhalte ich, dass Variable und analysieren sie als Dezimalzahl:

enter image description here

enter image description here

wie Sie sehen können, ist diese Arbeit s in Ordnung, das Problem ist, dass, wenn ich meinen Code auf Google Chrome oder Mozilla Firefox laufen, ich habe diferent Ergebnisse:

enter image description here

enter image description here

ich undestand nicht, warum das passiert, als nicht in allen passieren Maschinen, die das Web auf Chrome laufen, alles was ich denken kann ist, dass es etwas auf der Browser-Konfiguration zu sein scheint, aber es ist eine Standard-Installation, nichts anderes.

Kann mir jemand in die richtige Richtung zeigen? Oder hat eine Idee von was kann dieses Verhalten verursachen?

UPDATE:

-Code in Text (Ich weiß nicht, warum, aber ok)

Für easy-Debugging Ich habe dies:

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

Normalerweise ist so

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

Und die Web.Config

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

UPDATE 2

Ich weiß, dass der Code läuft auf dem Server, aber der einzige Unterschied der Browser ist, und es ist immer mit diesen Browsern auf ein paar Maschinen.

Unabhängig davon, ob der Server lokal oder auf Produktions

+1

Post-Code als ** Text ** –

+1

Auch C# -Code läuft auf dem Server; sollte egal sein, was der Browser ist – BradleyDotNET

Antwort

3

Decimal.Parse verwendet die CultureInfo des aktuelle Anforderung Anfragenhandhabungs Thread, die ASP.NET kann (wenn auch nicht standardmäßig) gesetzt wird ausgeführt gemäß Die Accept Kopfzeile des Browsers - damit Browser, die auf Französisch oder Deutsch eingestellt sind, ihre Formatierungsregeln verwenden (wobei Komma ',' der Radix-Platz ist, kein Punkt). Dies ist wahrscheinlich der Fall: Ihr Chrome-Browser ist auf eine andere Kultur eingestellt.

Die Lösung ist CultureInfo.InvariantCulture zu spezifizieren, wenn jede Parse oder ToString Methode aufrufen, wenn sie mit für Menschen lesbaren Text interagiert (beispielsweise, wenn eine Konfigurationsdatei laden).

Aus diesem Grund ist die statische Analyse wichtig (das Menü "Analysieren" in Visual Studio) - sie kann auf diese Fehler hinweisen.

(Meine persönliche Meinung ist, dass die Parse Methode von .NET und ersetzt mit expliziten ParseFormatted(IFormatProvider, String) und ParseInvariant(String) entfernt werden sollte - aber das ist nur mir :)

Ich stelle fest, dass ineffizient ist immer Parse in Ihr Eigentum zu nennen -GETTER. Sie sollten es nur statisch-Cache (die neue C# 6.0 schreibgeschützte Eigenschaft Syntax):

using System.Globalization; 

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

Wenn Sie dies tun häufig Sie könnten eine wiederverwendbare Methode wollen:

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 !! Einfach perfekt. Ich werde den Vorschlag berücksichtigen. Danke, Mann. –