字符串到十进制,总是有两个小数位

时间:2018-05-31 13:57:57

标签: c# decimal

我有一个要转换为十进制的字符串。输入的字符串没有小数位,例如“123”或2位小数,例如“123.45”或有点笨拙,1位小数“123.3”。我想要显示的数字(属性// components/LoginPopup/saga.js: import { all, call } from 'redux-saga/effects' import loginRquest from '../../containers/App/sagas'; export default function* (): Saga<void> { yield all([ call(loginRquest), ]) } ,类型invoice.Amount)有2个小数位。下面的代码就是这样。我认为它可以写得更好。怎么样?

decimal

部分地,我不明白,对于字符串格式化“########。00”,#does和0做了什么。例如。如果它是“########。##”会有什么不同?

4 个答案:

答案 0 :(得分:2)

#必填数字时,

0可选数字

例如

 decimal d = 12.3M;

 // d with exactly 2 digits after decimal point
 Console.WriteLine(d.ToString("########.00"));
 // d with at most 2 digits after decimal point 
 Console.WriteLine(d.ToString("########.##"));

结果:

12.30   // exactly 2 digits after decimal point: fractional part padded by 0
12.3    // at most 2 digits after decimal point: one digit - 3 - is enough

答案 1 :(得分:1)

基本上,#表示可选,其中0是必需的。 至于更好的解释,如果你输入#然后如果数字可用于fullfil占位符,它将被添加,否则它将被忽略。

然而,将0设置为不同,因为它总会为您设置一个值。

你可以把两者结合起来。

String.Format("{0:0.##}", 222.222222); // 222.22

String.Format("{0:0.##}", 222.2); // 222.2

String.Format("{0:0.0#}", 222.2) // 222.2

答案 2 :(得分:1)

“#”是可选的,而“0”将显示数字或0。

例如,

var x = 5.67;
x.ToString("##.###"); // 5.67
x.ToString("00.000"); // 05.670
x.ToString("##.##0"); // 5.670

如果你只关心你有多少小数位,我建议使用

x.ToString("f2"); // 5.67

获得2个小数点。

可以在http://www.independent-software.com/net-string-formatting-in-csharp-cheat-sheet.html/找到更多信息。

答案 3 :(得分:1)

您不需要将decimal转换为string来进行2位小数的格式化。您可以直接使用decimal.Round方法。你可以阅读它here

因此您的代码可以转换为

    decimal newDecimal;
    Decimal.TryParse(s, out newDecimal);

    newDecimal = decimal.Round(newDecimal, 2, MidpointRounding.AwayFromZero);

上面的代码也简化为C#7.0声明表达式

    Decimal.TryParse(s, out decimal newDecimal);

    newDecimal = decimal.Round(newDecimal, 2, MidpointRounding.AwayFromZero);

现在newDecimal将具有2个精度的值。

您可以查看this实况小提琴。