从具有数值的字符串中检测区域性信息

本文关键字:检测 区域性 信息 字符串 | 更新日期: 2023-09-27 18:05:50

这是一个List lstA;

lstA可以包含如下值(数据类型string): 1例

1

1.00

1000.01

1002 .98

.........

listA可以包含如下值:第二个示例

1

1,00

1000年01

1.002, 98

.........

我正试图将此列表传递给一个方法,它将返回一个字符串"german"或"us"

我正在尝试这个:

private static string ReturnCulture(List<string> lst)
    {
        string cull = "";
        foreach (string s in lst)
        {
            if (s.Contains(".") && s.Contains(","))
            {
                cull = "german";
                break;
            }
            else if (!s.Contains(".") && s.Contains(","))
            {
                cull = "german";
            }
            else if (s.Contains(".") && !s.Contains(","))
            {
                cull = "us";
                break;
            }
            else if (!s.Contains(".") && !s.Contains(","))
            {
                continue;
            }
        }
        return cull;
    }

对于前3个值可以很好地工作。但是当我得到( 1002.98 )或("1.002,98")时,这两个都满足德国条件。

如何解决这个问题?全球化阶层能轻易地分辨出它是哪种文化吗?给定的lstA示例实际上是随机的。但它将作为第一个例子第二个

从具有数值的字符串中检测区域性信息

如果您试图解析多个区域性的数字,可能会发现使用double很有用。使用区域性格式参数进行解析。参见使用区域性格式进行双重解析

给定一组字符串,您不能确定地创建一个方法来告诉您该字符串的格式是英语还是德语。您可以编写一个方法来告诉您是否所有字符串都可以被解析为英语或德语。由于预计会出现解析失败,因此应该使用Double。

private static bool AreAllStringsValidNumberRepresenationsForCulture(CultureInfo ci, List<string> lst)
{
    foreach (string s in lst)
    {
        double number;
        if (!Double.TryParse(s, NumberStyles.Any, ci, out number)
        {
            return false;
        }
    }
    return true;
}

接受显式输入总是比依赖启发式输入更好,所以如果有任何方法强制使用标准数字表示,您会更好。

您可以尝试使用两个区域性来解析它们,

,

public static string GetCulture(this string value)
{
    var doubleValue = default(double);
    var germanCultureInfo = new CultureInfo("de-DE");
    var englishCultureInfo = new CultureInfo("en-US");
    if (double.TryParse(value, NumberStyles.AllowDecimalPoint, germanCultureInfo, out doubleValue))
    {
        return "german";
    }
    else if (double.TryParse(value, NumberStyles.AllowDecimalPoint, englishCultureInfo, out doubleValue))
    {
       return "us";
    }
    return string.Empty; ;
}