【发布时间】:2008-12-12 01:13:32
【问题描述】:
我有来自数据库(字符串)中包含文本和价格的表的数据。我从数据中提取价格,但我的问题是有时我可以将其转换为浮动,有时不能。
我注意到了:
Convert.ToSingle(m.Groups[1].Value);
它有效,但并非总是如此,因为有时句号是问题(它需要逗号)。我能做些什么?我尝试用“,”替换“.”,但有时在其他 PC 上这是一个需要的时间段!
【问题讨论】:
我有来自数据库(字符串)中包含文本和价格的表的数据。我从数据中提取价格,但我的问题是有时我可以将其转换为浮动,有时不能。
我注意到了:
Convert.ToSingle(m.Groups[1].Value);
它有效,但并非总是如此,因为有时句号是问题(它需要逗号)。我能做些什么?我尝试用“,”替换“.”,但有时在其他 PC 上这是一个需要的时间段!
【问题讨论】:
你有这个问题,因为转换检查你的电脑的语言。您需要执行以下操作:
Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture.NumberFormat);
这样,它不会检查 PC 的语言。您可以从 MSDN 找到有关 InvariantCulture 的更多信息。我在一个项目中有类似的东西,我的转换工作。
【讨论】:
或者明确要求这种特定的数字格式:
System.Globalization.NumberFormatInfo nf
= new System.Globalization.NumberFormatInfo ( )
{
NumberGroupSeparator = "."
};
float f = float.Parse ( "5.34534", nf );
【讨论】:
如果您没有数据库的写入权限,首先要做的是尝试说服数据来源使用不变文化。如果用户正在输入数据,您可以执行以下操作:
float f = float.Parse(input);
string toDb = f.ToString(CultureInfo.InvariantCulture);
然后从另一边:
float f = float.Parse(fromDb, CultureInfo.InvariantCulture);
string toOutput = f.ToString();
不过,如果你能说服他们相信,正如 Lette 所说,说服他们使用本机数据类型可能会更好。
从上面的 sn-ps 中可以看出,出于各种原因,我还建议使用 float.Parse 而不是 Convert,但最重要的是能够使用 TryParse:
float f;
if (!float.TryParse(input, out f))
{
// ERROR
}
【讨论】:
正如其他人所说:
Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture);
您还必须确保在写入 到数据库时使用InvariantCulture。 (如果您将数据保存到具有其本机数据类型的列中会更好,但我离题了...)
【讨论】: