Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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# 由于使用了科学记数法,所以在double上重写了ToString的行为_C#_Double_Tostring - Fatal编程技术网

C# 由于使用了科学记数法,所以在double上重写了ToString的行为

C# 由于使用了科学记数法,所以在double上重写了ToString的行为,c#,double,tostring,C#,Double,Tostring,在任何人将此问题标记为或或的副本之前,请阅读此问题,因为它不完全相同 最近,我的一个用户注意到我的应用程序界面上有一个bug,其中一个应该包含数字的文本框却包含了科学符号。显然,我已经做了研究,发现由于某种原因,double.ToString()返回科学符号(请参阅) 我现在的问题是,我需要某种方法,而不必做以下事情: public static class Extensions { public static string AnExtensionMethodWithADifferent

在任何人将此问题标记为或或的副本之前,请阅读此问题,因为它不完全相同

最近,我的一个用户注意到我的应用程序界面上有一个bug,其中一个应该包含数字的文本框却包含了科学符号。显然,我已经做了研究,发现由于某种原因,
double.ToString()
返回科学符号(请参阅)

我现在的问题是,我需要某种方法,而不必做以下事情:

public static class Extensions
{
    public static string AnExtensionMethodWithADifferentName(this double dbl)
    {
        //Is this enough zeros? Oh well I'll just come back and code
        // more if I need them...
        return dbl.ToString("0.00000000000000000000000"); 
    }
}
这将覆盖double的默认
ToString()
方法

为什么我不这样做:
myDouble.ToString(“0.00000”)ToString()
将返回正确的值的情况下编写的,因此它可能有数千个

即使我想在某个地方的某个重写/扩展中放入无限多的零,我也不能扩展
double
ToString()
方法,因为它已经存在,我不能重写
ToString()
因为我不能从密封结构继承,而为整个应用程序中类型的每个属性制作一个double包装将生成一个巨大的、难以管理的代码


所以。。。我该怎么办?我想将
ToString()
的行为更改为函数名所建议的行为。

如果不更改区域设置,则无法更改
double.ToString()
的行为。您可能会选择使用科学符号的格式;我还没有尝试验证它是否有效,但我认为这是唯一的希望。

您可以覆盖应用程序中所有线程的区域性设置:

var nf = (NumberFormatInfo)Thread
    .CurrentThread
    .CurrentCulture
    .NumberFormat
    .Clone();

//setup NumberFormatInfo nf accordingly (*)

var cc = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
cc.NumberFormat = nf;
System.Threading.Thread.CurrentThread.CurrentCulture = cc;
这将改变所有
ToString()
调用的行为

(*)定制
NumberFormatInfo
可能还不够,您可能会建议这样做

编辑

不幸的是,这行不通。即使您以某种方式设法切换
的双
格式提供程序,它也将被忽略,如下所示:

自定义数字格式提供程序只能与String.format(IFormatProvider,String,Object[])方法一起使用。具有IFormatProvider类型参数的其他数值格式方法重载(如ToString)都会向IFormatProvider.GetFormat实现传递一个表示NumberFormatInfo类型的类型对象。作为回报,他们希望该方法返回NumberFormatInfo对象。否则,将忽略自定义数字格式提供程序,并使用当前区域性的NumberFormatInfo对象代替它


在研究了一天中的大部分时间后,我能想出的唯一满足我最初标准的解决方案是递归地迭代表单控件,并向textbox事件添加处理程序,这些事件将捕获给定的输入并相应地格式化double

你的“不重复”声明毫无意义。你是对的,它不是。试图防止人们对没有发生的事情过于兴奋。人们倾向于这样做。这样做只会更容易夸大对该帖子的蔑视。因此,您需要一个扩展,不需要扩展,也不需要替换现有的
Double.ToString()
。听起来不可能。我本质上希望这样:“Public Shadows ToString()As String”,但C#不提供Shadows关键字,double是密封的。您是否尝试更改小数位数(例如)?即使我指定了
myClonedNumberFormatInfo.NumberDecimalDigits=20,我也没有让它工作double.ToString
中使用的默认格式说明符是
G
而不是
N
,这是必需的。因此,如果调用
0.0.ToString(“N”)但那个OP想要避免。@TimSchmelter是的,我刚刚检查过,你是对的,这是不够的。我已经在答案中添加了相关信息。我想我会结合@DVNRS提供的解决方案来尝试此解决方案。我现在在工作站上遇到了一些技术问题,但我会让你知道我是怎么做的。@Brandon是的,我也不喜欢这样。周末我会尝试一些其他的东西,如果我发现了什么,会告诉你的。