如何在 C# 中检查字符串的一部分是否为货币

问题描述 投票:0回答:1

有没有办法检查第一个空格之前的子字符串是格式化为货币的数字,还是只是一个未格式化的数字?

原码:

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
时也是如此。在这种情况下,我需要它是假的。

c# string currency
1个回答
0
投票

似乎唯一表明您的字符串代表货币金额的是末尾的单词。那么为什么不创建一个包含货币名称和文化(对于货币符号)之间的映射的集合。然后你处理3个案例:

  1. 带有货币符号的数字字符串,如
    1,000,000 $
  2. 没有货币符号的数字字符串,如
    1,000,000
  3. 没有货币符号但有货币名称的字符串,如
    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>
。对于这个没关系。但也许你想在你有文化并想要它的货币名称的情况下重新使用它。

© www.soinside.com 2019 - 2024. All rights reserved.