C# 如何在c中检测字符串是否为货币#
通常,当我需要将C# 如何在c中检测字符串是否为货币#,c#,string,currency,C#,String,Currency,通常,当我需要将货币字符串(如1200,55 zł或$1249)转换为十进制值时,我会这样做: if (currencyString.Contains("zł)) { decimal value = Decimal.Parse(dataToCheck.Trim(), NumberStyles.Number | NumberStyles.AllowCurrencySymbol); } 有没有一种方法可以在不检查特定货币的情况下检查字符串是否为货币?如果您只是进行转换(您应该添加| Num
货币字符串
(如1200,55 zł或$1249)转换为十进制值时,我会这样做:
if (currencyString.Contains("zł)) {
decimal value = Decimal.Parse(dataToCheck.Trim(), NumberStyles.Number | NumberStyles.AllowCurrencySymbol);
}
有没有一种方法可以在不检查特定货币的情况下检查字符串是否为货币?如果您只是进行转换(您应该添加
| NumberStyles.AllowThousands
|NumberStyles.AllowDecimalPoint
则如果字符串包含当前UI的错误货币符号,则解析将失败-在这种情况下,将引发异常。它不包含货币符号,解析仍然有效
因此,您可以使用TryParse
来允许此操作并测试失败
如果您的输入可以是以
IFormatProvider
作为参数的任何货币,您可以使用该参数指定有关字符串的特定于区域性的解析信息。因此,如果默认UI区域性的解析失败,您可以在每个受支持的区域性之间循环,然后重试。当你找到一个有效的,你有你的数字和它的货币类型(兹罗提,美元,欧元,卢布等)你可以尝试搜索你认为是货币符号的字符串,然后在字典中查找它,看看它是否真的是货币符号。我只看字符串的开头和结尾,找出任何不是数字的东西,然后就是你要查找的东西。(如果两端都有东西,我想你可以假设它不是一种货币。)
这种方法的优点是只需扫描字符串一次,而不必对每种货币分别进行测试
下面是我想到的一个例子,尽管它可能需要一些改进:
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));
}
}
类程序
{
私有静态ISet_currencySymbols=new HashSet(){“$”、“zł”、“欧元”、“英镑”};
私有静态bool StringIsCurrency(string str)
{
//扫描字符串的开头,直到找到第一个数字
对于(int i=0;i
据我所知,最好是:
decimal value = -1;
if (Decimal.TryParse(dataToCheck.Trim(), NumberStyles.Number |
NumberStyles.AllowCurrencySymbol,currentCulture, out value)
{do something}
请参阅关于TryParse的描述。它不会引发异常,并且在异常情况下比解析速度更快。要检查字符串是否是用于输入工资的货币金额,我使用了以下方法:
public bool TestIfWages(字符串工资)
{
正则表达式正则表达式=新正则表达式(@“^\d*\.?\d?\d?$”;
bool y=regex.IsMatch(工资);
返回y;
}
为什么要检查如果(currencyString.Contains(“zł”)
?删除它,NumberStyles.AllowCurrencySymbol
就足够了。你知道字符串是一种货币吗?知道它是否是货币..因为另一个问题让我思考。如果没有检查,它会导致Visual Studio的速度大大减慢(相比之下,除此之外没有减速)@Tigran no,我在Comparer中使用此方法(根据此评论上面的链接)。这种方式比较方法可以决定它是一个字符串进行比较并像字符串一样排序,还是它是货币并像小数一样排序。如果你不知道数据是否是货币,你就没有任何货币符号,即使你知道它的货币,在post上看,它可以是英镑、美元、iene或WAT,无论你如何选择fI请选择正确的货币,因为不同区域性之间的格式可能不同。?+1 Spot on.TryParse返回一个布尔值,如果成功,除了通过引用指定解析的值外。该返回值将成为您的“检查”