有没有办法检查第一个空格之前的子字符串是格式化为货币的数字,还是只是一个未格式化的数字?
原码:
double d;
string s="1,000,000 pounds";
string value = s.Substring(0,s.IndexOf(' '));
bool b = double.TryParse(value, NumberStyles.Currency, CultureInfo.InvariantCulture, out d);
对于那个字符串有效并且是正确的。 但当字符串未格式化且类似于
1000 days
时也是如此。在这种情况下,我需要它是假的。
似乎唯一表明您的字符串代表货币金额的是末尾的单词。那么为什么不创建一个包含货币名称和文化(对于货币符号)之间的映射的集合。然后你处理3个案例:
1,000,000 $
1,000,000
1,000,000 pounds
void Main()
{
Console.WriteLine(IsCurrencyValue("1,000,000 pounds")); // true
Console.WriteLine(IsCurrencyValue("1,000,000 $")); // true
Console.WriteLine(IsCurrencyValue("£1,000,000")); // true
Console.WriteLine(IsCurrencyValue("1,000,000 days")); // false
}
private static readonly Dictionary<string, CultureInfo> currencies = new()
{
{"pound",new CultureInfo("en-GB")}, {"dollar",new CultureInfo("en-US")}, {"euro",new CultureInfo("de-DE")}
// add more if desired ...
};
public static bool IsCurrencyValue(string s)
{
if(string.IsNullOrWhiteSpace(s)) return false;
int spaceIndex = s.LastIndexOf(" ");
string token = spaceIndex == -1 ? null : s.Substring(spaceIndex).Trim();
if(token?.All(char.IsLetter) == true)
{
return currencies.Keys.Any(c => token.StartsWith(c, StringComparison.InvariantCultureIgnoreCase));
}
return currencies.Values.Any(culture => decimal.TryParse(s, NumberStyles.Currency, culture, out _));
}
演示:https://dotnetfiddle.net/hqxCoI
也许交换字典中的键和值更有意义,所以将其设为
Dictionary<CultureInfo, string>
。对于这个没关系。但也许你想在你有文化并想要它的货币名称的情况下重新使用它。