3

下一个方法的任何实现:

public static decimal StringToDecimal(string sValue)
{
    if (string.IsNullOrEmpty(sValue))
    {
        return 0;
    }
    ...
}

我的应用程序从其他机器的 excel 或 dbf 文件导入数据,读取字符串数据没有问题,但我没有成功读取正确的数字数据,尤其是价格列。源机器可以使用逗号作为小数分隔符或任何格式。

decimal.Parse(...) 或 decimal.TryParse(...) 仅在数值的字符串格式与应用程序机器设置匹配时才有效。

4

2 回答 2

4

当您调用decimal.TryParseordecimal.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”。在使用逗号作为千位分隔符的文化中,这可能意味着“一千二十四”,或者在使用逗号作为小数分隔符的文化中,它可能意味着“不到四分之一”。如果你不知道你应该使用哪个,你很容易出错。如果您知道值的预期范围,您可以将其用作启发式信息来检查您真正想要的值,但我仍然觉得有点担心。

于 2013-11-11T06:53:20.410 回答
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());
    }
于 2013-11-11T08:08:04.700 回答