如何在C#中检测字符串是否为货币?

6
通常,当我需要将货币字符串(例如1200,55 zł或$1,249)转换为十进制值时,我会这样做:
if (currencyString.Contains("zł)) {
    decimal value = Decimal.Parse(dataToCheck.Trim(), NumberStyles.Number | NumberStyles.AllowCurrencySymbol);
}

有没有一种方法可以检查字符串是否为货币,而不是检查特定的货币?


为什么要检查 if (currencyString.Contains("zł))?移除它,NumberStyles.AllowCurrencySymbol 就足够了。 - Saeed Amiri
你知道字符串可以表示货币吗? - Tigran
要知道它是否是货币,因为这个问题让我思考。没有这个检查,在 Visual Studio 中会导致巨大的减速(与其外部没有减速相比)。 - MadBoy
@Tigran 不是的,我在 Comparer 中使用这种方法(如上面评论中的链接所示)。这种方式可以让 Compare 方法决定它是否是要与字符串进行比较并像字符串一样排序,还是要与货币进行比较并像小数一样排序。 - MadBoy
无论如何,这个问题仍然有效 :-) 我想省略检查("zł")并找到其他方法(例如欧元/美元等)。 - MadBoy
显示剩余3条评论
4个回答

6
如果您只进行转换(还应添加| NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint),那么如果字符串包含了当前UI的错误货币符号,解析将会失败 - 在这种情况下,会引发异常。如果它不包含货币符号,则解析仍将成功。
因此,您可以使用TryParse来允许这种情况并测试是否失败。
如果您的输入可以是任何货币,您可以使用此版本的TryParse,该版本接受一个IFormatProvider作为参数,您可以在其中指定有关字符串的特定于区域性的解析信息。因此,如果默认UI区域设置的解析失败,则可以循环遍历每个受支持的区域设置,并再次尝试。当找到适合的区域设置时,您就得到了数字和货币类型(Zloty、美元、欧元、卢布等)。

+1 点。TryParse 方法返回一个布尔值,如果成功,则通过引用分配解析的值。该返回值成为您的“检查”。 - lsuarez

3

据我所知,最好做:

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

请参考Jeff Atwood的TryParse说明。它不会抛出异常,在异常情况下比Parse更快。


2

为了检查一个字符串是否是用于输入工资的货币金额,我使用了以下代码:

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


非常适用于货币! - pianocomposer

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接