如何检测字符串是否是c#中的货币

时间:2011-08-27 12:22:05

标签: c# string currency

通常当我需要将currency string(如1200,55zł或$ 1,249)转换为十进制值时,我会这样做:

if (currencyString.Contains("zł)) {
    decimal value = Decimal.Parse(dataToCheck.Trim(), NumberStyles.Number | NumberStyles.AllowCurrencySymbol);
}

有没有办法检查字符串是否为货币而不检查特定货币?

4 个答案:

答案 0 :(得分:5)

如果您只是进行转换(您还应添加| NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint),那么如果字符串包含当前UI的错误货币符号,则解析将失败 - 在这种情况下,通过引发异常。它不包含任何货币符号,解析仍然有效。

因此,您可以使用TryParse来允许此操作并测试失败。

如果您的输入可以是任何货币,则可以使用this version of TryParse作为参数,使用IFormatProvider作为参数,您可以使用该参数指定有关字符串的特定于区域性的解析信息。因此,如果解析失败了默认的UI文化,您可以循环再次尝试支持的每种文化。当你发现一个有效的那个你有你的号码和货币类型(兹罗提,美元,欧元,卢布等)

答案 1 :(得分:3)

据我了解,最好这样做:

decimal value = -1;
if (Decimal.TryParse(dataToCheck.Trim(), NumberStyles.Number | 
  NumberStyles.AllowCurrencySymbol,currentCulture, out value)
   {do something}

请参阅有关TryParse的Jeff Atwood说明。在异常情况下,它不会抛出异常并且速度比Parse快得多。

答案 2 :(得分:1)

您可以尝试在字符串中搜索您认为是货币符号的内容,然后在字典中查找它以查看它是否真的是货币符号。我只是看一下字符串的开头和字符串的结尾,挑出任何不是数字的东西,那就是你的样子。 (如果两端都有东西,我认为你可以认为它不是货币。)

这种方法的优点是你只需要扫描一次字符串,而不必为每种货币单独测试。

这是我想到的一个例子,虽然它可能会使用一些改进:

class Program
{
    private static ISet<string> _currencySymbols = new HashSet<string>() { "$", "zł", "€", "£" };

    private static bool StringIsCurrency(string str)
    {
        // Scan the beginning of the string until you get to the first digit
        for (int i = 0; i < str.Length; i++)
        {
            if (char.IsDigit(str[i]))
            {
                if (i == 0)
                {
                    break;
                }
                else
                {
                    return StringIsCurrencySymbol(str.Substring(0, i).TrimEnd());
                }
            }
        }
        // Scan the end of the string until you get to the last digit
        for (int i = 0, pos = str.Length - 1; i < str.Length; i++, pos--)
        {
            if (char.IsDigit(str[pos]))
            {
                if (i == 0)
                {
                    break;
                }
                else
                {
                    return StringIsCurrencySymbol(str.Substring(pos + 1, str.Length - pos - 1).TrimStart());
                }
            }
        }
        // No currency symbol found
        return false;
    }

    private static bool StringIsCurrencySymbol(string symbol)
    {
        return _currencySymbols.Contains(symbol);
    }

    static void Main(string[] args)
    {
        Test("$1000.00");
        Test("500 zł");
        Test("987");
        Test("book");
        Test("20 €");
        Test("99£");
    }

    private static void Test(string testString)
    {
        Console.WriteLine(testString + ": " + StringIsCurrency(testString));
    }
}

答案 3 :(得分:1)

要检查字符串是否是用于输入工资的货币金额 - 我使用了这个:

    public bool TestIfWages(string wages)
            {
                Regex regex = new Regex(@"^\d*\.?\d?\d?$");
                bool y = regex.IsMatch(wages);
                return y;
            }