[英]Decimal ToString() conversion issue in C#
我嘗試轉換decimal?
時遇到問題decimal?
string
。 情景是
decimal decimalValue = .1211;
string value = (decimalValue * 100).ToString();
當前結果:值= 12.1100
預期結果:值= 12.11
請讓我知道,這可能是什么原因。
Decimal
保留Decimal
數中的任何尾隨零。 如果你想要兩個小數位:
decimal? decimalValue = .1211m;
string value = ((decimal)(decimalValue * 100)).ToString("#.##")
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
要么
string value = ((decimal)(decimalValue * 100)).ToString("N2")
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
來自System.Decimal
:
十進制數是一個浮點值,由一個符號,一個數值組成,其中值中的每個數字范圍從0到9,以及一個縮放系數,表示浮動小數點的位置,用於分隔積分和小數部分的數值。
Decimal值的二進制表示由1位符號,96位整數和用於划分96位整數的比例因子組成,並指定它的小數部分。 縮放因子隱式為數字10,上升到指數范圍從0到28.因此,十進制值的二進制表示形式為((-2 96到2 96 )/ 10 (0到28) ) ,其中-2 96 -1等於MinValue,2 96 -1等於MaxValue。
縮放因子還保留十進制數中的任何尾隨零。 尾隨零不影響算術或比較運算中的十進制數的值。 但是,如果應用了適當的格式字符串<<,則可以通過ToString方法顯示>>尾隨零。
備注:
Nullable<decimal>.ToString
沒有格式提供程序 正如Chris指出你需要處理Nullable<decimal>
為null
。 一種方法是使用Null-Coalescing-Operator
:
((decimal)(decimalValue ?? 0 * 100)).ToString("N2")
Jon Skeet的這篇文章值得一讀:
.NET中的十進制浮點數 (如果你不耐煩的話,用於保持零 )
由於您使用Nullable<T>
作為decimal
,因此Nullable<T>.ToString()
方法沒有使用可用於格式化的參數的重載。
您可以顯式地將其轉換為decimal
而不是使用.ToString()
方法進行格式化。
只需在.ToString()
方法中使用"0.00"
格式。
decimal? decimalValue = .1211M;
string value = ((decimal)(decimalValue * 100)).ToString("0.00");
Console.WriteLine(value);
輸出將是;
12.11
這是一個DEMO
。
作為替代方案,您可以使用Nullable<T>.Value
而無需任何對話;
string value = (decimalValue * 100).Value.ToString("0.00");
或者,您可以指定格式“F2”,如下所示: string val = decVal.ToString("F2")
因為它指定2個小數位。
使用定點(“F)格式說明符 。
string value = (decimalValue * 100).ToString("F");
默認精度說明符基於NumberFormatInfo.NumberDecimalDigits屬性的值,默認值為2.因此,如果不指定數字aftyer“F”,則默認情況下指定兩個十進制數字。
F0 - No decimal places
F1 - One decimal place
如果您不想限制為一定數量的十進制數字:
decimal? decimalValue = .1211;
string value = decimalValue == null
? "0"
: decimalValue == 0
? "0"
: (decimalValue * 100).ToString().TrimEnd('0');
這將修剪字符串的任何(如果有)尾隨零,如果decimalValue
為null,則返回“0”。 如果該值為0,則返回“0”而不進行修剪。
String.Format("{0:0.00}", decimalValue * 100);
您可以使用.Format()
替代.ToString("0.00"
)。
decimal?
沒有ToString(string format)
重載,最簡單的方法是使用String.Format
,它與decimalValue
的null
case一起提供一致的結果(導致空字符串)與原始代碼相比:
string value = String.Format("{0:#.##}", decimalValue * 100);
但是對於其他您不清楚的數字還有其他一些考慮因素。
如果您的數字不會產生大於0的值,它是否顯示前導零? 也就是說,對於0.001211
,它是顯示為0.12
還是.12
? 如果你想要前導零,請改用它(注意從#.##
到0.##
的變化0.##
):
string value = String.Format("{0:0.##}", decimalValue * 100);
如果您有超過2個有效小數位,是否要顯示這些? 所以如果你有.12113405
它會顯示為12.113405
嗎? 如果是這樣使用:
string value = String.Format("{0:#.############}", decimalValue * 100);
(老實說,我認為必須有一個比這更好的格式化字符串,特別是因為它只支持12位小數)
當然,如果你想要前導零和多個小數位,只需要結合上面兩個:
string value = String.Format("{0:0.############}", decimalValue * 100);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.