2010-04-06 34 views
30

Tôi có hai trường nvarchar trong cơ sở dữ liệu để lưu trữ DataType và DefaultValue, và tôi có DataType Double và value là 65.89875 ở định dạng tiếng Anh.Làm thế nào để chuyển đổi chuỗi thành double với cultureinfo thích hợp

Bây giờ tôi muốn người dùng xem giá trị theo định dạng ngôn ngữ trình duyệt được chọn (65.89875 bằng tiếng Anh sẽ được hiển thị là 65.89875 bằng tiếng Đức). Bây giờ nếu người dùng chỉnh sửa từ định dạng tiếng Đức sang 65.89875 tương đương 65.89875 bằng tiếng Anh và lượt xem của người dùng khác từ trình duyệt tiếng Anh, nó có dạng là 6589875.

Điều này xảy ra vì trong cơ sở dữ liệu được lưu trữ là 65.89875 trong cột nvarchar và khi được chuyển đổi bằng cách sử dụng văn hóa tiếng Anh, nó trở thành 6589875 vì nó coi , là một dấu phân cách mà là toán tử thập phân cho tiếng Đức.

Làm cách nào để làm việc này cho tất cả các trình duyệt?

+0

Tại sao các bạn st oring số như văn bản để bắt đầu? Nếu bạn có thể thay đổi giản đồ, tôi khuyên bạn nên làm như vậy. –

Trả lời

1

Bạn có thể chuyển đổi giá trị mà người dùng cung cấp thành đôi và lưu trữ lại thành nvarchar, với sự trợ giúp của FormatProviders. CultureInfo là một FormatProvider điển hình. Giả sử bạn biết văn hóa bạn đang hoạt động,

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

sẽ đủ để thực hiện chuyển đổi cần thiết, như;

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

"de-de" là tên của người Đức ở miền địa phương Đức. – Richard

+0

@Richard, tôi đã tìm kiếm nó nhưng không thể tìm thấy, cảm ơn bạn. – tafa

54

Bạn cần định nghĩa một miền địa phương mà bạn sẽ sử dụng cho dữ liệu được lưu trữ trong cơ sở dữ liệu, văn bản bất biến có mục đích chính xác.

Khi bạn hiển thị chuyển đổi thành kiểu gốc và sau đó định dạng cho văn hóa của người dùng.

Ví dụ: display:

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

để lưu trữ:

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. Nó, gần như, đi mà không nói rằng bằng cách sử dụng một cột với một kiểu dữ liệu phù hợp với dữ liệu sẽ tốt hơn (nhưng đôi khi di sản được áp dụng).

0

Tôi có chức năng này trong toolbelt của tôi từ nhiều năm trước (tất cả các chức năng và tên biến là lộn xộn và trộn tiếng Tây Ban Nha và tiếng Anh, xin lỗi vì điều đó).

Điều này cho phép người dùng sử dụng ,. để tách các số thập phân và sẽ cố gắng làm tốt nhất nếu cả hai biểu tượng được sử dụng.

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 
1

Bạn có thể thay đổi văn hóa giao diện người dùng của bạn để bất cứ điều gì bạn muốn, nhưng bạn nên thay đổi các dấu phân cách số như thế này:

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

Với điều này, chuỗi của bạn chuyển đổi như thế này: "12,49" thay vì " 12,49" hoặc "12/49"

1

tôi mất một số sự giúp đỡ từ MSDN, nhưng đây là câu trả lời của tôi:

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")); 
Các vấn đề liên quan