簡體   English   中英

C#中的十進制ToString()轉換問題

[英]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方法顯示>>尾隨零。

備注:

  1. 十進制乘法需要轉換為十進制,因為Nullable<decimal>.ToString沒有格式提供程序
  2. 正如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");

查看自Custom Numeric Format Strings更多信息

或者,您可以指定格式“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 ,它與decimalValuenull 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM