C#三部分格式显示原始值

C#三部分格式显示原始值,c#,C#,我试图以C#三部分显示格式显示原始值。我得到了意想不到的结果+29291221321。我期待着+29.12121321。这是一个bug还是我做错了什么 double value1 = 29.1221321; string formattingString = $"+ {value1}; - {value1}; 0"; // returns "+29.1221321; -29.1221321; 0" Console.WriteLine(value1.ToS

我试图以C#三部分显示格式显示原始值。我得到了意想不到的结果
+29291221321
。我期待着
+29.12121321
。这是一个bug还是我做错了什么

double value1 = 29.1221321;
string formattingString = $"+ {value1}; - {value1}; 0";
 // returns "+29.1221321; -29.1221321; 0"
Console.WriteLine(value1.ToString(formattingString));
// returns "+ 29291221321" 
请参阅我为什么在最后调用ToString。它被称为三部分格式,可以基于+、-和0值快速分离结果

注意:
我不希望通过在小数点后指定x个#数字来硬编码。请告知是否有更好的方法以三部分格式显示原始十进制值

 string formattingString = "+ #.############; - #.############; 0";

将值放入格式说明符而不是说明符:

string formattingString = $"+ {value1}; - {value1}; 0";
+ 1,23456
 - 1,23456
 0
您的代码段应该如下所示:

double value1 = 29.1221321;
string formattingString = $"+ #.############; - #.############; 0";
Console.WriteLine(value1.ToString(formattingString));
由于您不想使用硬编码的小数位数(
双精度
),因此我不知道使用插值的方法。我推荐一种简单的扩展方法:

public static string ToSignedString(this double value) {
    if (value < 0)
        return $"-{value}";
    else if (value > 0)
        return $"+{value}";
    
    return "0";
}

这不是最优雅的解决方案,但它会起作用。

您尝试在Console.WriteLine中重新格式化Value1 将其更改为:

Console.WriteLine(格式化字符串)

请告知是否有更好的方法以三部分格式显示原始十进制值

 string formattingString = "+ #.############; - #.############; 0";
#
已经是表达你想要的东西的最佳方式,因为它最终会实现。一个
双精度
有大约,因此您可以在格式说明符的末尾放置17
#
,以获取原始值

double value1 = 1.23456;
string formattingString = "+ #.#################; - #.#################; 0";
Console.WriteLine(value1.ToString(formattingString));
Console.WriteLine((-value1).ToString(formattingString));
Console.WriteLine(0.ToString(formattingString));
输出(注意前导空格,因为格式说明符中有空格):

检查是否有一个包含更多数字的双精度值

double value1 = 1.2345678901234567890123;   // too many digits for a double
并将其与

Console.WriteLine(value1);

您正在将值本身放入格式字符串中,而不是占位符中。你甚至不清楚你想要哪种格式的字符串。分号这样做很奇怪:
formatingstring
不是格式字符串,它是由
$“+{value1};-{value1};0”执行的字符串插值操作的输出。第二个格式字符串工作正常,假设您希望直接输出formattingString
Console.WriteLine(formattingString)
@eulercode您的问题没有意义。您已经获得了您认为正确的结果(
+29.1221321;-29.1221321;0
),如果该结果已经正确,为什么还要将该结果进一步传递给
ToString()
?首先它不是a。嗨,我已经提到过,我不想使用第二个在小数点后加硬编码“#”的解places@eulercode根据您打算计算所需的
#
数量,您好,我接受您的回答。但我已经创建了一个新帖子,需要在这里作进一步解释:。希望你也能评论一下为什么把
放在里面会导致不可预测的输出