从具有数值的字符串中检测文化信息

时间:2013-03-25 13:36:41

标签: c# globalization cultureinfo

这是列表<字符串> LSTA

lstA 可能包含值(数据类型字符串),如: 第一个例子

  

1

     

1.00

     

1000.01

     

1,002.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个值很好。但当我得到( 1,002.98 )或(“1.002,98”)这两个满足德国条件。

如何解决这个问题?全球化课程能否容易地发现它是哪种文化? lstA 的给定示例实际上是随机的。但它可以是第一个例子第二个

3 个答案:

答案 0 :(得分:0)

如果你试图解析只有几种文化的数字,你可能会发现使用带有文化格式参数的double.parse有用。见Double parse with culture format

答案 1 :(得分:0)

您无法明确地创建一个方法,给定一组字符串将能够告诉您字符串是格式化为英语还是德语。您可以编写一个方法,告诉您是否可以将所有字符串解析为英语或德语。由于您希望解析失败,因此您应该使用Double.TryParse,如下所示:

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;
}

采用显式输入而不是依赖于启发式方法总是更好,所以如果有任何方法强制使用标准数字表示,那么你会更好。

答案 2 :(得分:0)

您可以尝试使用文化

解析它们

例如,

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; ;
}