Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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#_Linq - Fatal编程技术网

C# 使用定义的十进制分隔符检查数字

C# 使用定义的十进制分隔符检查数字,c#,linq,C#,Linq,我有一个函数,如下所示,我对linq不太熟悉 public static bool IsNumber(string s, char dec_sep) { return s.Length > 0 && s.All(c => Char.IsDigit(c)); } 如果这个数字包含一个十进制分隔符,我会得到false作为事实。 我想检查我定义的十进制分隔符是否在数字中 是否可以为此修改此功能? 还是我应该写另一个函数 为了更清楚

我有一个函数,如下所示,我对linq不太熟悉

    public static bool IsNumber(string s, char dec_sep)
    {
        return s.Length > 0 && s.All(c => Char.IsDigit(c));
    }
如果这个数字包含一个十进制分隔符,我会得到false作为事实。 我想检查我定义的十进制分隔符是否在数字中 是否可以为此修改此功能? 还是我应该写另一个函数

为了更清楚

如果字符串中有ise十进制分隔符,如72.5,则返回false。我定义的分隔符为。如果字符串为72或725,则它已返回true。
我希望此函数即使使用十进制分隔符也能返回TRUE。

我建议不要编写自己的IsNumber函数

框架已经有了所有内置值类型的TryParse,因此我建议使用float.TryParse、double.TryParse或decimal.TryParse,具体取决于您期望的23、64或128位数字的大小和精度

编写自己的IsNumber函数肯定会有一些困难,尤其是当您试图解析用户输入或任何您无法控制的输入时,因为与许多其他简单的事情一样,数字只不过是简单的

首先,数字可以有一个千分隔符-在英语中,1234.56是一个有效的数字。 第二,数字的字符串表示依赖于区域性-1234.56在某些区域性中无效-十进制分隔符是逗号,千位分隔符是点-因此您实际上可以这样写:1.234,56 请注意,这是两种不同的方法来编写相同的数字- 壹仟贰佰叁拾肆元伍角陆分百元。 更糟糕的是,你可以用不同的数字来写同一个数字——泰语、阿拉伯语、汉语或希伯来语——所有这些语言,可能还有更多的语言都有自己的数字符号——我不确定IsDigit是否涵盖了所有数字,尽管它可能也与文化有关

话虽如此,如果字符串为null,则当前函数将抛出NullReferenceException—您至少应该抛出ArgumentNullException,或者如果字符串为null,则返回false。 此外,还有一个有效的用例,您想知道一个字符在字符串中是否正好存在零或一次-一种方法是从LastIndexOf中减去IndexOf,并检查此子结构的结果是否为0。 要将其与当前方法相结合,还需要更改All方法中的条件,以允许字符为数字或指定的十进制分隔符

如果您真的需要编写自己的方法,我会这样开始:

public static bool IsNumber(string s, char dec_sep)
{
    return !string.IsNullOrEmpty(s)
        && s.LastIndexOf(dec_sep) - s.IndexOf(dec_sep) == 0 
        && s.All(c => Char.IsDigit(c) || c == dec_sep);
} 
如果字符串为null或为空,则第一个条件将返回false, 仅当字符串多次包含dec_sep时,第二个将返回false,
只有当字符串包含任何既不是数字也不是dec_sep的字符时,第三个字符才会返回false。

我建议不要编写自己的IsNumber函数

框架已经有了所有内置值类型的TryParse,因此我建议使用float.TryParse、double.TryParse或decimal.TryParse,具体取决于您期望的23、64或128位数字的大小和精度

编写自己的IsNumber函数肯定会有一些困难,尤其是当您试图解析用户输入或任何您无法控制的输入时,因为与许多其他简单的事情一样,数字只不过是简单的

首先,数字可以有一个千分隔符-在英语中,1234.56是一个有效的数字。 第二,数字的字符串表示依赖于区域性-1234.56在某些区域性中无效-十进制分隔符是逗号,千位分隔符是点-因此您实际上可以这样写:1.234,56 请注意,这是两种不同的方法来编写相同的数字- 壹仟贰佰叁拾肆元伍角陆分百元。 更糟糕的是,你可以用不同的数字来写同一个数字——泰语、阿拉伯语、汉语或希伯来语——所有这些语言,可能还有更多的语言都有自己的数字符号——我不确定IsDigit是否涵盖了所有数字,尽管它可能也与文化有关

话虽如此,如果字符串为null,则当前函数将抛出NullReferenceException—您至少应该抛出ArgumentNullException,或者如果字符串为null,则返回false。 此外,还有一个有效的用例,您想知道一个字符在字符串中是否正好存在零或一次-一种方法是从LastIndexOf中减去IndexOf,并检查此子结构的结果是否为0。 要将其与当前方法相结合,还需要更改All方法中的条件,以允许字符为数字或指定的十进制分隔符

如果您真的需要编写自己的方法,我会这样开始:

public static bool IsNumber(string s, char dec_sep)
{
    return !string.IsNullOrEmpty(s)
        && s.LastIndexOf(dec_sep) - s.IndexOf(dec_sep) == 0 
        && s.All(c => Char.IsDigit(c) || c == dec_sep);
} 
如果字符串为null或为空,则第一个条件将返回false, 仅当字符串多次包含dec_sep时,第二个将返回false,
只有当字符串包含既不是数字也不是dec\u sep的字符时,第三个字符才会返回false。

如果你是regex的粉丝,你也可以尝试^\\d+\.??\\d*?$

如果你是regex的粉丝,你也可以尝试^\\d+\.??\\d*?$

你想在这里做什么?你想解析一个代表十进制数的字符串吗?你能再解释一下吗?我不明白你的意思。如果你有两个十进制分隔符呢?为什么不使用已经内置的float.TryParse?还有数千个分离器呢?在我的语言和许多其他语言中,1234.56是一个完全有效的数字。。。。文化差异呢?如果有人想用阿拉伯或泰国数字怎么办?例如—สามสิบเอ็ด 根据和٧٤٤٢is 77542,至少在泰语中表示31…@ZoharPeled我在我的程序中用于特殊目的的逗号,因此我仅限于DOT。所以我不使用culturalinfo来选择十二月分隔符。你想在这里做什么?你想解析一个代表十进制数的字符串吗?你能再解释一下吗?我不明白你的意思。如果你有两个十进制分隔符呢?为什么不使用已经内置的float.TryParse?还有数千个分离器呢?在我的语言和许多其他语言中,1234.56是一个完全有效的数字。。。。文化差异呢?如果有人想用阿拉伯或泰国数字怎么办?例如—สามสิบเอ็ด 根据和٧٤٤٢is 77542,至少在泰语中表示31…@ZoharPeled我在我的程序中用于特殊目的的逗号,因此我仅限于DOT。所以我不使用文化信息来选择十二月分隔符。谢谢,这就是我需要的。我写了另一个函数,但我喜欢linq的技巧这里没有linq的技巧。这里唯一的linq部分是s.All…谢谢这是我需要的。我写了另一个函数,但我喜欢linq的技巧这里没有linq的技巧。这里唯一的linq部分是s.All。。。