Jag bloggar numera på http://blog.dileno.com ».

Prenumerera på RSS

Använd CultureInfo och TryParse för hantering av decimaler i ASP.NET

Om man ska formatera tal i .NET behöver man tänka på att olika länder har olika decimalavgränsare. Exempelvis används punkt som decimalavgränsare i England, medan vi i Sverige använder kommatecken.

För att visa rätt avgränsare för rätt språk bör man använda sig av klassen CultureInfo i .NET och kombinera den med TryParse-felhantering.

Importera System.Globalization och använd CultureInfo

För att kunna använda sig av CultureInfo måste man importera namespacet System.Globalization. Sedan använder vi oss av CultureInfo och NumberFormatInfo för att visa rätt decimalavgränsare:

// set correct CultureInfo to output correct number format
CultureInfo cultureInfo = CultureInfo.CurrentCulture;
NumberFormatInfo nfi = cultureInfo.NumberFormat;
nfi.CurrencyDecimalSeparator = ".";

double price = 14.90;

if (Double.TryParse(price.ToString(), NumberStyles.Any, nfi, out price) == false) price = 0.00;

litPrice.Text = price.ToString();

CultureInfo.CurrentCulture returnerar exempelvis sv-SE för Sverige och en-GB för England. I .NET finns automatiskt stöd för olika länders talhantering, vilket gör att vi får ut rätt decimalavgränsare för rätt land.

Felhantering med TryParse

En tumregel när man jobbar med tal i .NET är att använda TryParse för att kolla att det verkligen är rätt datatyp som returneras. Du kan använda TryParse för ett flertal datatyper, exempelvis Double och Int32.

I exemplet ovan ger jag slutligen Literalen litPrice ett värde, som ges av price.ToString().

Kommentarer

Men påverkas inte den globala inställningen på detta sättet? Det är knappast önskvärt. Jag vill bara styra det lokala beteendet för TryParse.

Visual Basic anser dessutom nfi.CurrencyDecimalSeparator vara read.only.

Jag gjorde en alternativ variant iom ovanstående, enligt nedan. Kanske inte världens vackraste lösning, men fungerar. En del felhantering togs bort för tydlighets skull.

Private Function ParseVal(ByVal val As String) As Double
If val = Nothing Then Return 0 'Must be a valid string

Dim doubleVal As Double

If Double.TryParse(val, doubleVal) Then Return doubleVal 'Try to parse

'Convert if wrong separator was used
Dim cultureInfo As CultureInfo = cultureInfo.CurrentCulture
Dim nfi As NumberFormatInfo = cultureInfo.NumberFormat
Dim septo As String = nfi.NumberDecimalSeparator
Dim sepfrom As String = IIf(septo = ".", ",", ".")

If Double.TryParse(val.Replace(sepfrom, septo), doubleVal) Then Return doubleVal 'Try again

Return 0
End Function

Till sidhuvudet

Clicky Web Analytics