【发布时间】:2013-09-06 21:31:11
【问题描述】:
事实上,我有多个可以生成数字数据的系统,它们以文本文件的形式存储在某个 Web 服务器上。有些系统使用小数点作为分数分隔符,有些系统使用小数点逗号作为相同。
应用程序(胖客户端,.net 2.0)也可以在任何一种系统上运行。
所以在一些磕磕绊绊之后我这样做了:(http://pastebin.com/vhLXABDD)
public static bool HasDecimalComma;
public static bool HasDecimalPeriod;
public static double GetNumber(string NumberString)
{
if (!HasDecimalComma && !HasDecimalPeriod)
{
string s = string.Format("{0:0.0}", 123.123);
if (s.Contains('.'))
{
HasDecimalPeriod = true;
}
else if (s.Contains(','))
{
HasDecimalComma = true;
}
else
{
throw new SystemException(string.Format("strange number format '{0}'", s));
}
}
if (HasDecimalComma)
{
return double.Parse(NumberString.Replace('.', ','));
}
if (HasDecimalPeriod)
{
return double.Parse(NumberString.Replace(',', '.'));
}
throw new ArgumentException(string.Format("can't parse '{0}'", NumberString));
}
您能提出更好、更优雅的方法吗?
编辑:
我很抱歉之前没有提到它,因为你的答案倾向于那个方向 - 我不能用数字存储生成文化,我只能尝试“检测”它。
【问题讨论】:
-
你能用数字字符串存储生成的文化吗?这将减轻对这种字符串弯曲的任何需求。
-
你大致知道生成的数字是多少吗?例如,归结为一组选项?我不确定您的系统将如何处理解析“1,000.12”(实际上我知道,它会中断)。如果您的可能格式数量有限,那么您可以尝试每种格式,前提是它们没有歧义的可能性。
-
我很幸运,所以永远不会出现千位分隔符。
-
所以你可以保证你的号码是一串数字,可能有一个前导减号和一个“.”,一个“,”或者在字符串的某个地方都没有?
-
总是,总是,总是使用不变的文化来序列化浮点数。持久化日期应始终采用已知形式。如果不是,你就失败了。 msdn.microsoft.com/en-us/library/…
标签: c# parsing regional-settings