Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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

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

C# 锥虫双值

C# 锥虫双值,c#,tryparse,C#,Tryparse,我需要验证双重值。当ITryParse.00或,00返回false,但我允许此值必须为true 此代码在这种情况下无法正常工作 型号=、00或.002或、789或.12 double number; double.TryParse(model, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number) 您可以循环所有受支持的区域性: bool parsable = false; double number = 0; var su

我需要验证双重值。当I
TryParse.00或,00
返回
false
,但我允许此值必须为true

此代码在这种情况下无法正常工作

型号=、00或.002或、789或.12

double number;
double.TryParse(model, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number)

您可以循环所有受支持的区域性:

bool parsable = false;
double number = 0;
var supportedCultures = new[] { CultureInfo.InvariantCulture, CultureInfo.CreateSpecificCulture("de-DE") };
foreach(var culture in supportedCultures)
{
    parsable = double.TryParse(model, NumberStyles.Any, culture, out number);
    if (parsable)
        break;
}
或使用LINQ:

CultureInfo thisCulture = supportedCultures
    .FirstOrDefault(c => double.TryParse(model, NumberStyles.Any, c, out number));
if (thisCulture != null)
{
    Console.WriteLine("Number was parsable to " + number);
}
旧方法,正如asawyer指出的那样,太容易出错(
“1000000.00”
):

可以用点替换逗号:

bool parsable = double.TryParse(model.Replace(",", "."), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number);

当您使用
NumberFormatInfo.InvariantInfo
时,您强制解析器将
视为十进制分隔符,将
视为千位分隔符。所以

double.TryParse(".002", out number)
将返回true,但是

double.TryParse(",789", out number)
不会


如果您想支持多种格式,则必须为每种格式调用
TryParse
。没有一种方法可以尝试解析一个格式有效的数字,因为它们可能返回不同的值<代码>“123456”可以用两种不同的方式解释,具体取决于您使用的文化。

我认为您不能真正安全地执行此操作。如果您设法让系统处理将“”和“”定义为十进制分隔符和分组分隔符的两种方法,那么您就会遇到歧义问题


例如,如果传入了
“1.001”
,该怎么办?“1001”怎么样?你怎么知道其中一个真的是“一千零一”还是“千分之一”

你为什么不读一下?运行这个
“.00”
会成功地解析到
0
,并且
”,00“
返回false。我需要”,00“返回真值also@DStanley
NumberFormatInfo.InvariantInfo
表示独立于区域性,不是吗?@asawyer是的,对不起-起初没有看到该部分。如何使用此更改解析
“1000000.00”
字符串替换是一个肮脏且可能被破坏的黑客行为。在您想要支持的区域性中循环是正确的方法,因为这实际上是解析
.00
.00
意味着的。@asawyer:我已经“删除”了这种方法,因为它很容易出错。@TimSchmelter A
SortedList
也可能是一个很好的改进,因为OP可以指定应该首先尝试哪些区域性。@恶心:但他也可以使用普通列表,因为
FirstOrDefault
(或循环)将在第一次匹配时中断,因此索引最低的区域性。