Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从具有数值的字符串中检测区域性信息_C#_Globalization_Cultureinfo - Fatal编程技术网

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

C# 从具有数值的字符串中检测区域性信息,c#,globalization,cultureinfo,C#,Globalization,Cultureinfo,这里是一个列表lstA lstA可能包含值(数据类型字符串),如: 第一个示例 一, 1.00 1000.01 1002.98 或者listA可能包含如下值:2nd example 一, 1,00 1000,01 1.002,98 我试图将此列表传递给一个方法,它将返回字符串“german”或“us” 我正在尝试: private static string ReturnCulture(List<string> lst) { string cull = "

这里是一个列表lstA

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

一,

1.00

1000.01

1002.98

或者listA可能包含如下值:2nd example

一,

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;
    }
私有静态字符串ReturnCulture(列表lst)
{
字符串消隐=”;
foreach(lst中的字符串s)
{
如果(s.Contains(“.”)和&s.Contains(“,”)
{
cull=“德语”;
打破
}
如果(!s.Contains(“.”)和&s.Contains(“,”),则为else
{
cull=“德语”;
}
如果(s.Contains(“.”)和&!s.Contains(“,”)
{
cull=“us”;
打破
}
如果(!s.Contains(“.”)&!s.Contains(“,”),则为else
{
继续;
}
}
返回剔除;
}
对于前3个值,此操作效果良好。但当我得到(1002.98)或(“1.002,98”)时,这两种情况都适用于德国条件


如何解决这个问题?全球化课程能很容易地检测出它是哪种文化吗?lstA的给定示例是真正随机的。但是,如果您试图只解析多个区域性的数字,则它将作为第一个示例或第二个示例,可能您会发现使用double.parse with culture format参数是有用的。请参见

您无法最终创建一种方法,即给定一组字符串将能够告诉您字符串的格式是英语还是德语。您可以编写一个方法,该方法将告诉您是否可以将所有字符串解析为英语或德语。由于您预期解析会失败,因此应在中使用as:

private static bool areallstringsvalidnumberrepresentationsforculture(文化信息ci,列表lst)
{
foreach(lst中的字符串s)
{
双数;
if(!Double.TryParse(s,NumberStyles.Any,ci,out number)
{
返回false;
}
}
返回true;
}

最好采用显式输入,而不是依赖启发式,因此如果有任何方法强制使用标准数字表示,您最好使用。

您可以尝试使用这两种文化来解析它们

例如


当两种文化共享相同的符号时会发生什么?我必须在这里考虑两种符号.在我最后的第五行中,我澄清了我担心的问题。你的最终目标是什么?为什么你需要将数字解析为文化?我必须用这个列表的值进行一些计算,我必须用德语格式进行计算。但是输入并不总是用德语。因此,我建议你将帖子改为“我如何解析来自不同文化背景的数字”-因为当你收到不变的数字时,你可以很容易地将它们格式化为德语。
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; ;
}