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

本文关键字:是否是 货币 字符串 何检测 检测 | 更新日期: 2023-09-27 18:06:44

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

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

是否有一种方法来检查如果字符串是货币没有检查特定的货币?

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

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

因此,您可以使用TryParse来允许这一点并测试失败。

如果您的输入可以是任何货币,您可以使用这个版本的TryParse,它以IFormatProvider作为参数,您可以使用它指定关于字符串的特定文化的解析信息。因此,如果解析默认UI区域性失败,您可以再次遍历每个支持的区域性。当你找到一个可以使用的电话时,你就有了你的电话号码和货币类型(兹罗提,美元,欧元,卢布等)

据我所知,最好这样做:

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

参见Jeff Atwood关于TryParse的描述。它不会抛出异常,并且在异常情况下比Parse快得多。

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

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

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

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

下面是我想到的一个例子,尽管它可能需要一些改进:

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));
    }
}