Keith™ 发表于 2017-6-17 12:16:33

将字符串转换为具有默认值的非负非零双精度值

我需要这样的东西..欢迎提出意见和建议,public double toPositiveDouble(string input, double def = 1){。
双dv;。
如果 (!Double.TryParse(input, out dv){。
//无法解析,返回默认值。
dv = def;。
}。
else if ((dv + Math.Abs(dv)) == 0){。
//值为负,返回默认值。
dv = def;。
}。
}。
**** Hidden Message *****

Atook 发表于 2017-6-17 12:43:02

Abs 调用而不是检查这是我的看法,扩展方法可能被认为是糟糕的形式。public static double ToPositiveDouble(此字符串输入,double def = 1)。
{。
双dv;。
如果 (!Double.TryParse(input, out dv)){。
//无法解析,返回默认值。
返回定义;。
}。
else if (dv。
{。
//值为负,返回默认值。
dv = def;。
}。
返回 dv;。
}。

用法。
字符串 d = “-36”;。
double dv = d.ToPositiveDouble(42.0);。


Keith™ 发表于 2017-6-17 13:09:41

不,只是一个脑屁

Atook 发表于 2017-6-17 14:50:37

不要觉得太糟糕,我还没有喝咖啡,意识到我不知道如何检查一个数字是否是负数,谷歌把我带到这里...
这时我想起了我的咖啡前无代码规则..

kdub 发表于 2017-6-17 15:46:32

怎么样:    void Main(){ 。
控制台,WriteLine(is negative(-3.7));。
控制台,WriteLine(is negative(42));。

// - 。
string ds = " 36。
double dv = ToPositiveDouble(ds,42.0);。
控制台,WriteLine($ " { ds }:= > { dv } ");。
// - 。
ds = "-36 ";。
dv = topositedouble(ds,42.0);。
控制台,WriteLine($ " { ds }:= > { dv } ");。

// - 。
ds =。
dv = topositedouble(ds,42.0);。
控制台,WriteLine($ " { ds }:= > { dv } ");。

// - 。
ds = " 0。
dv = topositedouble(ds,42.0);。
控制台,WriteLine($ " { ds }:= > { dv } ");。
}。

public static double topositedouble(字符串输入,double def = 1) {。
双dv;。
return (Double,TryParse(输入、输出dv) &&!IsNegative(dv))?dv:def;。

}。

///零在这个世界上被认为是负数。
公共静态布尔值为负(T值)。
其中T : struct,IComparable {。
返回值,CompareTo(default(T)) 。
}。


      真假 36:= > 36 -36:= > 42 := > 420:= > 42   修订:///零在这个世界上被认为是负数。

kdub 发表于 2017-6-17 16:37:52

更好的算法会检查IsPo正()...并且它读起来也更好,ulul Main(){。
Console.WriteLine(IsPo正(-3.7));。
Console.WriteLine(正(42));。
Console.WriteLine(IsPo正(0.0));。
//-------。
字符串ds="36";。
双dv=ToPositiveDouble(ds,42.0);。
Console.WriteLine($"{ds}:=>{dv}");。
//-------。
ds="-36";。
dv=ToPositiveDouble(ds,42.0);。
Console.WriteLine($"{ds}:=>{dv}");。
//-------。
ds = "";。
dv=ToPositiveDouble(ds,42.0);。
Console.WriteLine($"{ds}:=>{dv}");。
//-------。
ds="0";。
dv=ToPositiveDouble(ds,42.0);。
Console.WriteLine($"{ds}:=>{dv}");。
}。

公共静态双ToPositiveDouble(字符串输入,双def=1){。
双dv;。
返回(Double.TryParse(输入,输出dv)&&IsPo正(dv))? dv: def;。
}。
公共静态bool IsPo正(T值)。
其中T:结构,I可比{。
返回value.CompareTo(默认(T))>0;。
}。

公共静态bool IsGregative(T值)。
其中T:结构,I可比{。
返回value.CompareTo(默认(T))。
}。
FalseTrueFalse36:=>36-36:=>42:=>420:=>42。

Keith™ 发表于 2017-6-18 08:45:34

有趣的我曾考虑过写这样的东西,但我不想在第一次多重比较中依赖短路。我知道它应该一直都能工作,但它感觉像是一个黑客而不是一个设计的功能。

gile 发表于 2017-6-18 10:40:17

您好,<br>短路是&&运算符的设计功能,即使使用out参数,您也可以完全依赖它。

kdub 发表于 2017-6-18 21:32:19


是的,如果改变了,世界上会有很多代码爆炸
链接无效,所以尝试
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-and-operator

Keith™ 发表于 2017-6-18 22:43:40

我以前读过。我不知道……这可能是设计意图,但对我来说仍然像是一次黑客攻击。
另一方面,这是
公共双拓扑双(字符串输入,双定义=1){
双dv
<div>返回(双色锥波(输入,输出dv)&&dv>0)?dv:def
}
</div在我看来,它完成了所有必要的操作,并返回大于0的正值,如果输入无法转换为正值,则返回默认值<我真的认为我在这样一个琐碎的函数上花费了太多的时间
页: [1] 2
查看完整版本: 将字符串转换为具有默认值的非负非零双精度值