it-swarm.com.de

Wie konvertiert man einen String in ein Double mit der richtigen Kultur

Ich habe zwei Nvarchar-Felder in einer Datenbank, um den DataType und DefaultValue zu speichern, und ich habe einen DataType Double und einen Wert als 65.89875 im englischen Format.

Nun möchte ich, dass der Benutzer den Wert gemäß dem ausgewählten Browsersprachenformat sieht (65.89875 in Englisch sollte als 65.89875 in Deutsch angezeigt werden). Wenn der Benutzer nun aus dem deutschen Format 65.89875 (also 65.89875) und die anderen Benutzeransichten aus einem englischen Browser heraus bearbeitet, wird 6589875 angezeigt.

Dies geschieht, weil es in der Datenbank als 65,89875 in der Spalte nvarchar gespeichert wurde und bei der Konvertierung mit englischer Kultur 6589875 wird, da es , als Trennzeichen betrachtet, das ein Dezimaloperator für Deutsch ist.

Wie bekomme ich das für alle Browser zum Laufen?

32
Vinay Pandey

Sie müssen ein einzelnes Gebietsschema definieren, das Sie für die in der Datenbank gespeicherten Daten verwenden werden. Die invariante Kultur ist genau für diesen Zweck vorhanden.

Wenn Sie anzeigen, konvertieren Sie in den nativen Typ und formatieren Sie anschließend die Kultur des Benutzers.

Z.B. anzeigen:

string fromDb = "123.56";
string display = double.Parse(fromDb, CultureInfo.InvariantCulture).ToString(userCulture);

lagern:

string fromUser = "132,56";
double value;
// Probably want to use a more specific NumberStyles selection here.
if (!double.TryParse(fromUser, userCulture, NumberStyles.Any, out value)) {
  // Error...
}
string forDB = value.ToString(CultureInfo.InvariantCulture);

PS. Es ist fast selbstverständlich, dass die Verwendung einer Spalte mit einem Datentyp, der mit den Daten übereinstimmt, sogar noch besser wäre (manchmal gilt jedoch auch ein älterer Typ).

57
Richard

Ich habe etwas Hilfe von MSDN erhalten, aber dies ist meine Antwort:

double number;
string localStringNumber;
string doubleNumericValueasString = "65.89875";
System.Globalization.NumberStyles style = System.Globalization.NumberStyles.AllowDecimalPoint;

if (double.TryParse(doubleNumericValueasString, style, System.Globalization.CultureInfo.InvariantCulture, out number))
    Console.WriteLine("Converted '{0}' to {1}.", doubleNumericValueasString, number);
else
    Console.WriteLine("Unable to convert '{0}'.", doubleNumericValueasString);
localStringNumber =number.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("de-DE"));
3
user2738678

Convert.ToDouble (x) kann auch einen zweiten Parameter enthalten, der die CultureInfo angibt und wenn Sie diese auf System.Globalization.CultureInfo InvariantCulture Setzen. Das Ergebnis ist immer das gleiche.

1
Bolle

Sie können den Wert, den Benutzer zur Verfügung stellt, in ein Double konvertieren und mit Hilfe von FormatProviders erneut als nvarchar speichern. CultureInfo ist ein typischer FormatProvider. Vorausgesetzt, Sie kennen die Kultur, die Sie betreiben,

System.Globalization.CultureInfo EnglishCulture = new System.Globalization.CultureInfo("en-EN");
System.Globalization.CultureInfo GermanCulture = new System.Globalization.CultureInfo("de-de");

wird genügen, um die notwendige Transformation durchzuführen, wie;

double val;
if(double.TryParse("65,89875", System.Globalization.NumberStyles.Float, GermanCulture,  out val))
{
    string valInGermanFormat = val.ToString(GermanCulture);
    string valInEnglishFormat = val.ToString(EnglishCulture);
}

if(double.TryParse("65.89875", System.Globalization.NumberStyles.Float, EnglishCulture,  out val))
{
    string valInGermanFormat = val.ToString(GermanCulture);
    string valInEnglishFormat = val.ToString(EnglishCulture);
}
1
tafa

Sie können Ihre UI-Kultur beliebig ändern. Sie sollten jedoch das Zahlentrennzeichen wie folgt ändern:

CultureInfo info = new CultureInfo("fa-IR");
info.NumberFormat.NumberDecimalSeparator = ".";
Thread.CurrentThread.CurrentCulture = info;
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

Damit konvertieren Ihre Strings folgendermaßen: "12.49" statt "12.49" oder "12/49"

Ich habe diese Funktion seit Jahren in meinem Toolbelt (alle Funktions- und Variablennamen sind unordentlich und mischen Spanisch und Englisch, entschuldige das).

Der Benutzer kann , und . verwenden, um die Dezimalstellen zu trennen, und wird versuchen, das Beste zu tun, wenn beide Symbole verwendet werden.

    Public Shared Function TryCDec(ByVal texto As String, Optional ByVal DefaultValue As Decimal = 0) As Decimal

        If String.IsNullOrEmpty(texto) Then
            Return DefaultValue
        End If

        Dim CurAsTexto As String = texto.Trim.Replace("$", "").Replace(" ", "")

        ''// You can probably use a more modern way to find out the
        ''// System current locale, this function was done long time ago
        Dim SepDecimal As String, SepMiles As String
        If CDbl("3,24") = 324 Then
            SepDecimal = "."
            SepMiles = ","
        Else
            SepDecimal = ","
            SepMiles = "."
        End If

        If InStr(CurAsTexto, SepDecimal) > 0 Then
            If InStr(CurAsTexto, SepMiles) > 0 Then
                ''//both symbols was used find out what was correct
                If InStr(CurAsTexto, SepDecimal) > InStr(CurAsTexto, SepMiles) Then
                    ''// The usage was correct, but get rid of thousand separator
                    CurAsTexto = Replace(CurAsTexto, SepMiles, "")
                Else
                    ''// The usage was incorrect, but get rid of decimal separator and then replace it
                    CurAsTexto = Replace(CurAsTexto, SepDecimal, "")
                    CurAsTexto = Replace(CurAsTexto, SepMiles, SepDecimal)
                End If
            End If
        Else
            CurAsTexto = Replace(CurAsTexto, SepMiles, SepDecimal)
        End If
        ''// At last we try to tryParse, just in case
        Dim retval As Decimal = DefaultValue
        Decimal.TryParse(CurAsTexto, retval)
        Return retval
    End Function
0
Eduardo Molteni