C# 小数格式仅显示小数部分

Gru*_*ski 0 c# string.format

我正在寻找String.Format或ToString()只decimal得到小数部分。 '123.56m => "56"

Dai*_*Dai 5

  • 不幸的是,没有任何数字自定义格式说明符仅适用于小数部分,但如果您先进行一些算术运算,则可以提取它然后格式化它......
    • ...您也需要打电话.Substring。
  • 另外,请务必使用CultureInfo.InvariantCulture,否则每个用户的语言/文化/区域设置将意味着可能会使用不同的默认格式和小数点字符,但使用CultureInfo.InvariantCulture意味着小数点将始终是 ASCII 点'.'字符。
  • IFormatProvider我确实尝试了使用and的方法ICustomFormatter,不幸的Decimal.ToString(IFormatProvider) 是需要 provider.GetFormat 返回一个NumberFormatInfo值并且不支持使用ICustomFormatter。
    • 虽然IFormatProvider和ICustomFormatter如果与 一起使用就会起作用String.Format,但这不是你的问题。

  • 用于Math.Abs()将负数转换为正数(否则有一个前导-符号字符会使.Substring调用站点变得复杂)。
  • 用作".############################"格式字符串对应于值中的最大小数位数Decimal(即 28 位)。
    • 前导.部分是必要的。
  • 当fractionalPartis0时,则没有数字可渲染.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"
Run Code Online (Sandbox Code Playgroud)

您可以将其简化为 2 行:

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

例子:

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"
Run Code Online (Sandbox Code Playgroud)