下一个方法的任何实现:
public static decimal StringToDecimal(string sValue)
{
if (string.IsNullOrEmpty(sValue))
{
return 0;
}
...
}
我的应用程序从其他机器的excel或dbf文件导入数据,我没有读取字符串数据的问题,但我没有成功读取数字数据,特别是Price列。 源计算机可以使用逗号作为小数分隔符或任何格式。
decimal.Parse(...)或decimal.TryParse(...)仅在数值的字符串格式与应用程序机器设置匹配时才有效。
答案 0 :(得分:4)
当您致电decimal.TryParse
或decimal.Parse
时,您可以指定文化(因此请避免仅提取系统设置)。您可以一次尝试一个您感兴趣的每种文化,直到找到值成功解析的文化。
bool decimal TryParseAllCultures(string text, out value)
{
foreach (var culture in cultures)
{
if (decimal.TryParse(text, NumberStyles.Number, culture, out value))
{
return true;
}
}
return false;
}
(您需要决定支持哪些文化,以及NumberStyles.Number
实际上是您感兴趣的NumberStyle
。)
话虽如此,做到这一点非常危险。考虑“1,234”。在使用逗号作为千位分隔符的文化中,这可能意味着“一千二百四十四”,或者在使用逗号作为小数分隔符的文化中它可能意味着“仅少于一个四分之一”。如果你无法分辨出你应该使用哪一个,你很容易就会出错。如果你知道预期的值范围,你可以使用它作为启发式信息来检查你真正想要的值,但它仍然让我感到有点担心。
答案 1 :(得分:0)
这似乎有效
public static char DecimalSeparator(string sValue)
{
var decimalPosition = sValue.Length - 4;
if (decimalPosition < 0)
{
return '.';
}
var decimalPart = sValue.Substring(decimalPosition);
if (decimalPart.Contains(','))
{
return ',';
}
return '.';
}
public static decimal StringToDecimal(string toParse)
{
if (string.IsNullOrEmpty(toParse))
{
return 0;
}
var stb = new StringBuilder();
var localDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator.ToCharArray()[0];
var sourceDecimalSeparator = DecimalSeparator(toParse);
var sNumeric = "0123456789-" + sourceDecimalSeparator;
for (var i = 0; i < toParse.Length; i++)
{
var currentChar = toParse[i];
if (sNumeric.IndexOf(currentChar) > -1)
{
if (currentChar == sourceDecimalSeparator)
{
currentChar = localDecimalSeparator;
}
stb.Append(currentChar);
}
}
return decimal.Parse(stb.ToString());
}