如何使用适当的cultureinfo将字符串转换为double

Vin*_*dey 35 .net c# globalization localization

我在数据库中有两个nvarchar字段来存储DataType和DefaultValue,我有一个DataType Double,值为65.89875英文格式.

现在我希望用户按照所选的浏览器语言格式查看值(英语中的65.89875应显示为德语中的65,89875).现在,如果用户从德语格式编辑为65,89875(英语为65.89875),而英语浏览器中的其他用户视图则为6589875.

发生这种情况是因为在数据库中它在nvarchar列中存储为65,89875,并且在使用英语文化转换时,它变为6589875,因为它将其视为,分隔符,它是德语的十进制运算符.

如何让这个适用于所有浏览器?

Ric*_*ard 61

您需要定义一个将用于存储在数据库中的数据的区域设置,不变文化就是为此目的.

当您显示转换为本机类型,然后格式化用户的文化.

例如显示:

string fromDb = "123.56";
string display = double.Parse(fromDb, CultureInfo.InvariantCulture).ToString(userCulture);
Run Code Online (Sandbox Code Playgroud)

储藏:

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

PS.几乎不言而喻,使用具有与数据匹配的数据类型的列会更好(但有时遗留适用).

  • @sLw `CultureInfo` 实现了 `IFormatProvider`:[该重载](https://learn.microsoft.com/en-us/dotnet/api/system.double.tryparse?view=netcore-2.2#System_Double_TryParse_System_String_System_Globalization_NumberStyles_System_IFormatProvider_System_Double__) 允许您传递所需的区域设置。但是——五年来——这个问题一直放在这里,第二个和第三个参数颠倒了(更正)! (2认同)

小智 5

您可以将 UI 文化更改为您想要的任何内容,但您应该像这样更改数字分隔符:

CultureInfo info = new CultureInfo("fa-IR");
info.NumberFormat.NumberDecimalSeparator = ".";
Thread.CurrentThread.CurrentCulture = info;
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
Run Code Online (Sandbox Code Playgroud)

有了这个,你的字符串会像这样转换:“12.49”而不是“12,49”或“12/49”