簡體   English   中英

C# 十進制格式只顯示小數部分

[英]C# decimal format to display just the fraction part

我正在尋找String.FormatToString()一個decimal來得到小數部分。 '123.56m => "56"

  • 不幸的是,沒有任何數字自定義格式說明符只用於小數部分,但如果你先做一些算術,你可以提取它然后格式化它......
    • ...您還需要一個.Substring電話。
  • 此外,請務必使用CultureInfo.InvariantCulture ,否則每個用戶的語言/文化/區域設置將意味着可能使用不同的默認格式和小數點(小數點)字符,但使用CultureInfo.InvariantCulture意味着小數點永遠是一個 ASCII 點'.' 字符。
  • 我確實嘗試過使用IFormatProviderICustomFormatter的方法,不幸的是Decimal.ToString(IFormatProvider)需要provider .GetFormat 返回NumberFormatInfo值並且不支持使用ICustomFormatter
    • 雖然IFormatProviderICustomFormatter如果與String.Format一起使用會起作用,但這不是您的問題。

  • 使用Math.Abs()將負數轉換為正數(否則有一個前導符號字符會使-調用站點復雜.Substring )。
  • 使用".############################"作為格式字符串對應於Decimal值中的最大小數位數 (即 28 位數字)。
    • 領先的. 部分是必要的。
  • fractionalPart0時,則沒有要呈現的數字,並且.ToString( format: "#.########", provider: CultureInfo.InvariantCulture )將返回"" (這將導致.Substring( startIndex: 1 )拋出異常,所以我們可以用三元表達式跳過它)。
Decimal dec            = 123.45M;
Decimal fractionalPart = Math.Abs( dec - Decimal.Truncate( dec ) );

String formatted       = fractionalPart.ToString( CultureInfo.InvariantCulture, ".############################" );

if( formatted.StartsWith( '.' ) ) formatted = formatted.Substring( startIndex: 1 );

Console.WriteLine( "{0} --> \"{1}\"", dec, formatted ); // "123.45 --> 45"

您可以將其簡化為 2 行:

Decimal fractionalPart = Math.Abs( value - Decimal.Truncate( value ) );
return ( fractionalPart == 0 ) ? String.Empty : fractionalPart.ToString( format: ".############################", provider: CultureInfo.InvariantCulture ).Substring( startIndex: 1 );

例子:

static String FmtOnlyFractional( Decimal value )
{
    Decimal fractionalPart = Math.Abs( value - Decimal.Truncate( value ) );
    return ( fractionalPart == 0 ) ? String.Empty : fractionalPart.ToString( format: ".############################", provider: CultureInfo.InvariantCulture ).Substring( startIndex: 1 );
}

FmtOnlyFractional(    0.0M        ); => ""
FmtOnlyFractional(    1.0M        ); => ""
FmtOnlyFractional(    1.1M        ); => "1"
FmtOnlyFractional4(   1.0010000M  ); => "001"
FmtOnlyFractional(    0.00000001M ); => "00000001"
FmtOnlyFractional(  123.00000001M ); => "00000001"
FmtOnlyFractional( -123.00000001M ); => "00000001"
FmtOnlyFractional(   -0.00000001M ); => "00000001"
FmtOnlyFractional(   -1.0000000M  ); => ""
FmtOnlyFractional(   -1.0000001M  ); => "000001"
FmtOnlyFractional(   -1.1000001M  ); => "100001"

另一種方法假設你有最多 2 位數的分數

decimal value = 123.56m;
string result = (value % 1 * 100).ToString("F0"); //"56"

字符串Split()方法

decimal value = 123.56m;
char separator = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator.First();
string result = value.ToString("F2").Split(separator ).Last();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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