通常当我需要将currency string
(如1200,55zł或$ 1,249)转换为十进制值时,我会这样做:
if (currencyString.Contains("zł)) {
decimal value = Decimal.Parse(dataToCheck.Trim(), NumberStyles.Number | NumberStyles.AllowCurrencySymbol);
}
有没有办法检查字符串是否为货币而不检查特定货币?
答案 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;
}