我正在寻找String.Format或ToString()只decimal得到小数部分。
'123.56m => "56"
.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)
| 归档时间: |
|
| 查看次数: |
546 次 |
| 最近记录: |